附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱 Oracle Cloud Infrastructure Free Tier 入門。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特定的值。
使用 OCI GoldenGate 設定兩個 Oracle Heatwave MySQL 受管理執行處理之間的雙向複製
簡介
Oracle Cloud Infrastructure GoldenGate (OCI GoldenGate) 是一項完全託管的服務,可協助資料工程師即時將資料大規模地從一或多個資料管理系統移轉至 OCI 資料庫。在單一介面中設計、執行、協調及監控資料複製作業,無須配置或管理任何運算環境。OCI GoldenGate 支援數個來源和目標,包括 MySQL 和 Oracle HeatWave MySQL 資料庫服務。
在本教學課程中,我們將指導您如何使用 OCI GoldenGate,在 OCI 中的兩個 Oracle HeatWave MySQL 執行處理之間設定雙向複寫。
目標
- 使用 OCI 中的 OCI GoldenGate,在兩個 Oracle HeatWave MySQL 管理的執行處理之間設定雙向複寫。
必要條件
-
來源和目標 Oracle HeatWave MySQL 執行處理必須使用
InnoDB
引擎,且必須在5.7
或8.*
版本上執行。 -
對於雙向複製,建議在來源和目標上使用相同版本的 MySQL 執行處理。
-
來源和目標執行處理上的
binlog_expire_logs_second
執行處理參數必須至少設為 72 小時。 -
來源和目標執行處理上的
binlog_row_metadata
執行處理參數必須設為完整,才能允許「資料定義語言 (DDL)」複製。注意:只能透過建立自訂組態來變更執行處理參數。如需詳細資訊,請參閱 Creating a Custom Configuration for MySQL 。
-
複查支援的資料類型。如需詳細資訊,請參閱 MySQL:支援的資料類型、物件和作業。
-
複查 DDL 複製限制。如需詳細資訊,請參閱使用 DDL 複製。
-
必須從使用下列其中一種方法的來源提前建立目標執行處理:
- 方法 1:使用 MySQL shell 公用程式,例如
util.dumpInstance
和util.loadDump
。 - 方法 2:透過 OCI 主控台式備份與回復選項。
- 方法 3:使用 OCI GoldenGate 進行初始 Extract 和 Replicat 以執行初始資料載入。本教學課程中已使用此方法 (任務 7)。
- 方法 1:使用 MySQL shell 公用程式,例如
-
依照設計,「擷取」會忽略活動訊號表 DDL。您應該在目標手動建立活動訊號表。
-
已安裝 MySQL 從屬端的堡壘主機。
-
傳入規則和更新的安全清單,可允許來源、目標、堡壘主機和 OCI GoldenGate 之間進行通訊。
作業 1:部署 OCI GoldenGate
-
登入 OCI 主控台,搜尋 GoldenGate ,選取 GoldenGate 服務,然後按一下建立部署。
-
輸入下列資訊,然後按一下建立。
- 名稱:輸入
MySQLggdeployment1
。 - 部署類型:選取資料複製。
- 選取技術 (Select Technology):選取 MySQL 。
- 選取版本:輸入
21.15
。 - 硬體組態: 輸入 # 個 OCPU。
- 子網路選擇:選取子網路。
- 授權類型:選取授權類型。
- 執行處理名稱:輸入
GGInstance1
。 - 證明資料存放區:選取 GoldenGate (建立新的密碼加密密碼或選取現有的密碼)。
- 名稱:輸入
作業 2:在 Oracle HeatWave MySQL 執行處理中建立使用者
-
使用 OCI 堡壘主機連線至來源和目標 MySQL 執行處理,以及建立 OCI GoldenGate Extract 和 Replicat 處理作業的使用者。執行下列查詢:
-
在來源 MySQL 執行處理上。
> create user 'ggsuser_S'@'%' identified by "<password>"; > grant all privileges on airportdb.* to 'ggsuser_S'@'%' with grant option; > Grant select, process, replication slave, replication client on *.* to 'ggsuser_S'@'%';
-
在目標 MySQL 執行處理上。
> create user 'ggsuser_T'@'%' identified by "<password>"; > grant all privileges on airportdb.* to 'ggsuser_T'@'%' with grant option; > Grant select, process, replication slave, replication client on *.* to 'ggsuser_T'@'%';
-
作業 3:在 OCI GoldenGate 部署中設定連線
-
前往 OCI GoldenGate 部署頁面,然後按一下連線以設定連線。
-
輸入連線資訊。
-
重複上述步驟來新增來源和目標連線。
-
選取部署,然後按一下指派的連線,將連線指派給部署。
作業 4:設定 OCI GoldenGate 主控台的傳入規則和安全清單
-
設定傳入規則並更新安全清單,以允許 Oracle HeatWave MySQL 執行處理、OCI GoldenGate 部署及 OCI 堡壘主機運算之間的通訊。
注意:如果您使用 VPN,則可以略過此步驟。
依照此處所列的步驟進行:選項 B:在 OCI Compute 上使用您自己的堡壘主機。
ssh -i <private-ssh-key-of-bastion-compute> opc@<bastion-compute-public-ip> -L 443:<GoldenGategate-deployment-hostname>:443 -N
-
在 OCI 主控台中透過 OCI GoldenGate 主控台測試來源和目標資料庫的連線。
-
驗證 OCI 主控台內的 MySQL 執行處理連線。
-
從 OCI GoldenGate 主控台驗證相同的連線。
-
工作 5:建立 Extract 和 Replicat 處理作業
-
建立主要 Extract (
EXT1
)。-
登入 OCI GoldenGate 主控台。
-
前往概觀,然後按一下擷取區段中的 + 。
-
輸入「摘錄」資訊。
-
視需要編輯參數檔。下列參數檔會擷取
classicmodels
資料庫中的所有變更,包括 DDL 變更。EXTRACT ext1 USERIDALIAS MySQLpoc1, DOMAIN OracleGoldenGate EXTTRAIL e1 DDL INCLUDE MAPPED TRANLOGOPTIONS FETCHPARTIALJSON TABLE classicmodels.*;
注意:
MySQLpoc1
是來源執行處理。 -
啟動擷取並記下來源上的全域交易識別碼 (GTID)。
MySQL> select @@gtid_executed, @@gtid_purged\G *************************** 1. row *************************** @@gtid_executed: 3b631a96-6aa7-11ef-95c0-02001701769c:1-94 <--- make a note of this GTID @@gtid_purged: 3b631a96-6aa7-11ef-95c0-02001701769c:1-72 1 row in set (0.00 sec) MySQL>
啟動 Extract 並讓它隨時保持執行,即使您仍在處理設定目標資料庫以確保擷取所有變更。
-
-
建立主要 Replicat (
REP1
)。-
登入 OCI GoldenGate 主控台。
-
前往總覽,然後按一下 Replicat 區段中的 + 。
注意:檢查點表格名稱前面應加上小寫的資料庫 / 綱要名稱。若未這麼做,將會導致建立檢查點表格失敗。
例如,
classicmodels.OCIGG_CHECKPOINT_REP1
。建議為檢查點表格建立個別的專用資料庫 / 綱要 (例如,
ggadmin
綱要)。MySQL> create database ggadmin; Query OK, 1 row affected (0.01 sec) MySQL> grant all privileges on ggadmin.* to 'ggsuser_T'@'%' with grant option; Query OK, 0 rows affected (0.00 sec) MySQL> grant all privileges on ggadmin.* to 'ggsuser_S'@'%' with grant option; Query OK, 0 rows affected (0.00 sec)
-
視需要編輯參數檔。下列參數檔會複製
classicmodels
資料庫底下的所有物件以及 DDL 變更。REPLICAT rep1 USERIDALIAS MySQLpoc2, DOMAIN OracleGoldenGate DDL INCLUDE MAPPED MAP classicmodels.*, TARGET classicmodels.*;
注意:
MySQLpoc2
是目標執行處理。 -
這是主要 Replicat,而且是第一次啟動的,因此會從歷程檔 0 開始套用。不過,如果您想要更改 Replicat 從特定 GTID 開始,請依照下列步驟進行:
-
前往 OCI GoldenGate 主控台中的 Replicat 小節。
-
選取 Replicat,依序按一下更改、編輯、開始,然後選取 GTID 並輸入 GTID 。
-
-
-
到目前為止,我們已經為「資料處理語言 (DML)」與 DDL 複製設定了單向。單向複寫一旦同步,我們可以繼續進行雙向複寫。
-
重複步驟 5.1 和步驟 5.2,但這次我們回轉了來源和目標詳細資訊。來源資料庫執行處理現在將作為目標執行處理,而目標執行處理將作為來源執行處理。
- 來源:輸入
MySQLpoc2
。 - 目標:輸入
MySQLpoc1
。 - 在此使用案例中,我們使用第二個資料庫
airportdb
。您可以為同一個資料庫設定雙向複製。
- 來源:輸入
-
新增主要 Extract (
EXT2
)。EXTRACT ext2 USERIDALIAS MySQLpoc2, DOMAIN OracleGoldenGate EXTTRAIL e2 DDL INCLUDE MAPPED TRANLOGOPTIONS FILTERTABLE ggadmin.OCIGG_CHECKPOINT_REP* -- from 23ai GG use EXCLUDEFILTERTABLE TABLE airportdb.*;
-
手動建立檢查點表格,因為這是傳統 Replicat。雙向複製只支援「傳統」和「協調式複製」。
For example: ggadmin.OCIGG*CHECKPOINT_REP`- Add primary REPLICAT REP2:` REPLICAT rep2 USERIDALIAS MySQLpoc1, DOMAIN OracleGoldenGate DDL INCLUDE MAPPED MAP airportdb.*, TARGET airportdb.\_;
-
作業 6:執行 DDL 與 DML 測試
現在雙向設定已完成,有了執行簡單 DML 與 DDL 測試的時間點。
--DML test from classicmodels database on source MySQLpoc1
MySQLpoc1> select count(*) from weatherdata;
+----------+
| count(*) |
+----------+
| 4626432 |
+----------+
1 row in set (0.19 sec)
MySQLpoc1> insert into weatherdata values ('2005-01-02','04:50:00',-8.1,3,57.0,990.00,38.00,'Nebel-Schneefall',61);
Query OK, 1 row affected (0.00 sec)
MySQLpoc1> select count(*) from weatherdata;
+----------+
| count(*) |
+----------+
| 4626433 |
+----------+
1 row in set (0.23 sec)
-DDL replication test from classicmodels database on source MySQLpoc1
MySQLpoc1> create table test (name char(5));
Query OK, 0 rows affected (0.02 sec)
MySQL> insert into test values ('cj');
Query OK, 1 row affected (0.00 sec)
MySQL>
--Now Let's check if the above DML and DDLs got replicated to target MySQLpoc2
MySQLpoc2> select count(*) from weatherdata;
+----------+
| count(*) |
+----------+
| 4626433 | <--- row count matches to source
+----------+
1 row in set (0.37 sec)
MySQLpoc2>
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj | <-- table CJ got replicated
+------+
1 row in set (0.00 sec)
MySQL>
-- Now testing Bi directional
-- on target (MySQLpoc2)
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj |
+------+
1 row in set (0.00 sec)
MySQLpoc2> insert into test values ('cj2');
Query OK, 1 row affected (0.01 sec)
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj |
| cj2 |
+------+
2 rows in set (0.00 sec)
MySQLpoc2> insert into test values ('cjs3');
Query OK, 1 row affected (0.00 sec)
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj |
| cj2 |
| cjs3 |
+------+
3 rows in set (0.00 sec)
MySQLpoc2>
--On source (MySQLpoc1):
--DML on the target got REPLICATed on the source
MySQLpoc1> select * from test;
+------+
| name |
+------+
| cj |
| cj2 |
| cjs3 |
+------+
3 rows in set (0.00 sec)
MySQL>
作業 7:設定初始載入摘錄
-
如果您想要利用 OCI GoldenGate 執行起始資料載入目標資料庫,請設定「起始載入擷取」。
-
登入 OCI GoldenGate 主控台。
-
前往概觀,然後按一下擷取區段中的 + 。這與建立主要 Extract 非常類似,唯一的差別在於在建立 Extract 時,選取擷取類型作為初始載入。
初始載入 Extract 的參數檔。
Parameter file for initial load EXTRACT: EXTRACT EXTIL USERIDALIAS MySQLpoc1, DOMAIN OracleGoldenGate EXTFILE il , PURGE TABLE airportdb.*; MAP_PARALLELISM 4 MIN_APPLY_PARALLELISM 2 MAX_APPLY_PARALLELISM 10 SPLIT_TRANS_RECS 1000 CHUNK_SIZE 1 GB
-
-
同樣設定 Replicat,以讀取初始載入 Extract 所產生的歷程檔。初始載入完成後,將會刪除此 Replicat 和初始載入 Extract。
-
在目標資料庫上,確定所有表格都是空的。刪除 / 停用目標上的所有外來索引鍵。停用目標上的觸發程式和索引,以提升起始載入效能。
注意:請先備份綱要物件 DDL,再刪除任何項目。
-
下列為若使用初始載入 Extract 進行初始資料載入,應建立 Extract 和 Replicat 處理作業的順序。
-
建立來源的主要 Extract (尚未啟動處理作業)。
-
建立來源的初始載入 Extract (尚未啟動處理作業),並擷取來源上的 GTID。
-
建立 Replicat 以處理起始載入 Extract 為目標產生的歷程檔 (尚未啟動處理作業)。
注意:初始載入沒有個別的 Replicat 類型。
-
建立目標的主要 Replicat (尚未啟動處理作業)。
-
初始載入 Replicat 和主要 Replicat 使用相同的檢查點表格。起始載入 Replicat 指向起始 Extract 歷程檔,主要 Replicat 指向主要 Extract 歷程檔 (兩個歷程檔均不同)。
-
-
下列是在使用初始載入 Extract 時,處理作業的啟動順序。
-
啟動主要 Extract 並記下它註冊的 GTID。
-
啟動為起始載入 Extract 建立的 Replicat。
-
編輯初始載入 Extract 並將其更改為以啟動主要 Extract 時所得到的 GTID 為開頭。
-
啟動主要 Replicat。
注意:
- 初始載入的 Extract 和 Replicat 均同步後,才啟動主要 Replicat (LAG 0)。
- 請先建立或啟用外來索引鍵,再啟動主要 Replicat。
開始主要 Replicat 之前,請先建立索引 (如果您先將它們刪除以提升初始載入效能)。
-
-
限制
-
只有 Classic 和 Coordinated Replicat 支援雙向和多向複製,不支援平行 Replicat。
-
自動遞增資料欄問題。
-
如果表格有一個資料欄不是主索引鍵或唯一索引鍵,則對應會失敗,因為來源和目標上該表格之所有資料欄的組合都相同。
-
資料類型、DDL 及其他功能限制。
-
使用「主動 - 主動」複製時,兩個系統上的時區必須相同,以利時間戳記為基礎的衝突解決與偵測能夠運作。
相關連結
認可
- 作者 - Chakradhar Jagganagari (LIFT 導入專家 - 自訂、第三方、VM 資料庫和應用程式)
其他學習資源
探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Set up Bidirectional Replication Between Two Oracle Heatwave MySQL managed instances using OCI GoldenGate
G29689-02
Copyright ©2025, Oracle and/or its affiliates.