準備要處理的表格
本節描述如何準備要處理的表格。表格準備需要下列任務。
確定表格的資料列唯一性
Oracle GoldenGate 需要來源和目標表格上某種形式的唯一資料列 ID,才能尋找正確的目標資料列以進行複製的更新和刪除。
除非在 TABLE 或 MAP 敘述句中使用 KEYCOLS 子句,否則 Oracle GoldenGate 會選取資料列 ID,以下列優先順序使用:
-
主索引鍵
-
不包含時戳或非具體化計算資料欄的第一個唯一索引鍵文數字。
-
如果沒有任何先前的金鑰類型存在 (即使表格中可能定義了其他類型的金鑰),Oracle GoldenGate 會建構所有資料欄的虛擬金鑰資料庫允許用於唯一金鑰中,不包括金鑰中 Oracle GoldenGate 不支援的金鑰或 Oracle GoldenGate 組態中排除的金鑰。
注意:如果表格上有其他不可使用的金鑰,或表格上沒有金鑰,Oracle GoldenGate 會將適當的訊息記錄至報表檔案。從所有資料欄建構索引鍵,代表來源系統上 Oracle GoldenGate 的效能。在目標上,此索引鍵會讓 Replicat 使用更大且更低效率的 WHERE 子句。
- 如果表格沒有適當的索引鍵,或者您偏好不使用現有的索引鍵,您可以定義替代索引鍵 (如果表格的資料欄一律包含唯一值)。您可以在 Extract
TABLE參數和 ReplicatMAP參數中包含KEYCOLS子句,以定義此替代索引鍵。指定的金鑰將會覆寫 Oracle GoldenGate 找到的任何現有主索引鍵或唯一索引鍵。請參閱Oracle GoldenGate 參照中的 TABLE | MAP 。
具有從唯一索引衍生之主索引鍵的表格
如果沒有表格的主索引鍵,MySQL 會在索引資料欄為 NOT NULL 時,將唯一索引提升為主索引鍵。如果其中有一個以上的非空值索引,則第一個建立的索引會變成主索引鍵。為了避免 Replicat 錯誤,請在來源表格和目標表格上,以相同的順序建立這些索引。
例如,假設名稱為 ggvam.emp 的來源和目標表格各有名稱為 first、middle 和 last 的資料欄,且全部定義為 NOT NULL。如果您以下列順序建立唯一的索引,Oracle GoldenGate 將會在目標上中止,因為表格定義不相符。
來源:
CREATE UNIQUE INDEX UQL ON ggvam.emp(first);
CREATE UNIQUE INDEX UQ2 on ggvam.emp(middle);
CREATE UNIQUE INDEX UQ3 on ggvam.emp(last);
目標:
CREATE UNIQUE INDEX UQ1 ON ggvam.emp(last);
CREATE UNIQUE INDEX UQ2 ON ggvam.emp(first);
CREATE UNIQUE INDEX UQ3 ON ggvam.emp(middle);
此順序的結果是 MySQL 會將來源 "first" 資料欄上的索引升級為主索引鍵,並將目標 "last" 資料欄上的索引升級為主索引鍵。Oracle GoldenGate 會在建立其描述資料記錄時選取主索引鍵作為 ID,而描述資料則不相符。若要避免此錯誤,請決定要升級至主索引鍵的資料欄,然後先在來源和目標上建立該索引。
指定要使用的 Oracle GoldenGate 金鑰
如果表格沒有前述類型的資料列 ID,或者您偏好不使用這些 ID,則如果表格的資料欄一律包含唯一值,您可以定義替代索引鍵。您可以在 Extract TABLE 參數和 Replicat MAP 參數中包含 KEYCOLS 子句,以定義此替代索引鍵。指定的金鑰將會覆寫 Oracle GoldenGate 找到的任何現有主索引鍵或唯一索引鍵。
限制沒有索引鍵之表格的資料列變更
如果目標表格沒有主索引鍵或唯一索引鍵,則可以有重複的資料列。在此情況下,Oracle GoldenGate 可能會更新或刪除太多目標資料列,導致來源和目標資料不同步,而不會出現錯誤訊息來提醒您。若要限制更新的資料列數目,請將 DBOPTIONS 參數與 Replicat 參數檔中的 LIMITROWS 選項搭配使用。LIMITROWS 可提升目標系統上的 Oracle GoldenGate 效能,因為僅處理一個資料列。
觸發程式與串聯限制考量
觸發程式
停用目標表格上的觸發程式,或將它們更改為忽略 Oracle GoldenGate 資料庫使用者所做的變更。Oracle GoldenGate 會複製觸發程式所產生的 DML。如果在目標表格上啟用相同的觸發程式,則因複製的版本而變成冗餘,且資料庫會傳回錯誤。
重複套用限制考量
Oracle GoldenGate 擷取的連鎖更新與刪除不會以二進位日誌記錄,因此不會擷取更新與刪除。這適用於 MySQL 和 MariaDB。例如,當您在父項表格中以表格之間的父項子項關係執行 delete 敘述句時,子項表格會刪除層疊 (如果有的話),但不會記錄在二進位日誌中。只有父項表格的刪除或更新記錄會記錄在二進位日誌中,並由 Oracle GoldenGate 擷取。
請參閱 https://mariadb.com/kb/en/replication-and-foreign-keys/ 和 https://dev.mysql.com/doc/refman/8.0/en/innodb-and-mysql-replication.html 以瞭解詳細資訊。
若要正確處理重疊作業的複製,建議停用重疊刪除與更新來源與程式碼,並在修改上階記錄前,明確地刪除或更新下階記錄。或者,您必須確定目標父項表格與來源父項表格具有相同的連鎖限制條件,但這可能會導致來源和目標之間發生不同步的情況,特別是在雙向複製的情況下。