自動衝突偵測與解析

當 Oracle GoldenGate 在 Oracle 資料庫之間複製變更時,您可以在 Oracle 資料庫中設定及管理「Oracle GoldenGate 自動衝突偵測與解決」。注意:Oracle Database 12c 版本 2 (12.2) 和更新版本提供「自動衝突偵測與解決」功能,並可與 Oracle GoldenGate 12c (12.3.0.1) 和更新版本搭配使用。有一個手動衝突偵測與解決功能,稱為 Oracle GoldenGate 衝突偵測與解決 (CDR)。Oracle GoldenGate CDR 已在 Replicat 參數檔中設定。若要深入瞭解 Oracle GoldenGate CDR,請參閱手動衝突偵測與解決。

關於自動衝突偵測與解決

當 Oracle GoldenGate 在 Oracle 資料庫之間複製變更時,您可以在這些資料庫中自動設定和管理 Oracle GoldenGate 衝突偵測和解決。

此功能適用於主動 - 主動組態,Oracle GoldenGate 必須在包含相同資料集的多個資料庫之間維持資料同步。

注意:只有在搭配 Oracle AI Database 使用 Oracle GoldenGate 時,才能使用自動衝突偵測與解決 (ACDR) 功能。對於非 Oracle 資料庫,Oracle GoldenGate 提供手動衝突偵測與解決 (CDR) 功能。Oracle GoldenGate CDR 已在 Replicat 參數檔中設定。

自動衝突偵測與解析

您可以在 Oracle GoldenGate 組態中設定自動衝突偵測和解決方法,以在 Oracle 資料庫之間複製表格。若要設定表格的自動衝突偵測和解決方法,您必須呼叫 DBMS_GOLDENGATE_ADM 套裝程式中的 ADD_AUTO_CDR 程序。設定自動衝突偵測和解決的先決條件,Oracle GoldenGate 使用者必須要有適當的權限。請參閱授與 Oracle AI Database 26ai 和 Higher 的使用者權限和授與 Oracle Database 21c 和 Lower 的使用者權限,以瞭解使用者權限。

在呼叫 ADD_AUTO_CDR 時,管理員使用者必須登入適當的 PDB。現在會加入下列常數,這些常數代表位元旗標:

下列範例在 HR.EMPLOYEES 表格中使用 ALTER 指令:

BEGIN
 dbms_goldengate_adm.alter_auto_cdr
 (schema_name => 'HR'
 ,table_name => 'EMPLOYEES'
 ,additional_options => DBMS_GOLDENGATE_ADM.ADDITIONAL_OPTIONS_ADD_KEY_VERSION );
END;
/

請參閱 Oracle AI Database PL/SQL Packages and Types Reference 之 ADD_AUTO_CDR Procedure 中的 additional_options 描述。

當 Oracle GoldenGate 擷取源自 Oracle AI Database 的變更時,每個變更都會封裝在資料列邏輯變更記錄 (LCR) 中。資料列 LCR 是 DML 資料列變更的結構化表示法。每個資料列 LCR 都包含作業類型、舊的資料欄值以及新資料欄值。多個資料列 LCR 可以是單一資料庫交易的一部分。

如果表格有多個複本允許變更表格,則幾乎相同時間對兩個不同資料庫中的相同資料列進行變更時,就會發生衝突。Oracle GoldenGate 會使用資料列 LCR 來複製變更。它會比較來源資料庫初始變更之資料列 LCR 中的舊值與索引鍵資料欄所識別之目的地資料庫的對應表格資料列目前值,以偵測衝突。如果有任何資料欄值不相符,就會發生衝突。

偵測到衝突之後,Oracle GoldenGate 可以覆寫資料列中的值與資料列 LCR 的某些值、忽略資料列 LCR 中的值,或計算差異以更新資料列值,來解決衝突。

自動衝突偵測與解決不需要應用程式變更,原因如下:

自動衝突偵測與解析的需求

以下是設定 Oracle GoldenGate 中自動 CDR 的主要需求:

相容性和移轉

如果來源資料庫的基本表格未包含 KEYVER$$ 資料欄,但目標基本表格包含 DELETE 和主索引鍵更新,則目標資料庫中 EARLIEST TIMESTAMP、DELETE ALWAYS WINS 和 SITE PRIORITY 解析會發生錯誤。

從具有 KEYVER$$ 的基本表格複製到目標表格時,會忽略 KEYVER$$ 資料欄。

資料欄群組

資料欄群組是複製表格中一或多個資料欄的邏輯群組。當您新增資料欄群組時,會在資料欄群組中的資料欄與表格中的其他資料欄分別執行衝突偵測和解決。

當您使用 ADD_AUTO_CDR 程序設定 Oracle GoldenGate 衝突偵測和解決方法的表格時,表格中的所有純量資料欄都會新增至預設資料欄群組。若要定義表格的其他資料欄群組,請執行 ADD_AUTO_CDR_COLUMN_GROUP 程序。表格中不屬於使用者定義之資料欄群組的任何資料欄,都會保留在表格的預設資料欄群組中。

資料欄群組可讓不同的資料庫在幾乎相同的時間更新相同資料列中的不同資料欄,而不會造成衝突。設定表格的資料欄群組時,即使不同的資料庫更新表格中的相同資料列,也能避免衝突。如果更新會變更不同資料欄群組中資料欄的值,則不會偵測到衝突。

圖 1:資料欄群組

影像的描述如下

此範例顯示正在資料庫 A 和資料庫 B 複製的資料列。下列兩個資料欄群組是針對每個資料庫的複製表格所設定:

這些欄群組可讓資料庫 A 和資料庫 B 在幾乎相同的時間更新相同列,而不會造成衝突。具體而言,會進行下列變更:

因為 Office 資料欄和 Title 資料欄位於不同的資料欄群組中,所以複製變更時不會偵測到衝突。結果就是每次複製變更之後,資料列中的值都在兩個資料庫中都是相同的。

Piecewise LOB 更新

一組由 LOB WRITE、LOB ERASE 和 LOB TRIM 組成的 LOB 作業,是一個順暢的 LOB 更新。當設定了包含 LOB 資料欄的表格進行衝突偵測與解決時,每個 LOB 資料欄都會放置在它自己的資料欄群組中,而資料欄群組則有自己的隱藏時間戳記資料欄。第一個片段 LOB 作業會更新時戳資料欄。

對於 LOB 資料欄,系統會以下列方式偵測並解決衝突:

最早時戳衝突偵測與解決方法

名稱為 CDRTS$ column group 和 CDRTS$ROW 的資料欄會用來包含反映資料欄群組和資料列修改時間的時戳。

注意:含有 $ 或 $$ 符號的表格是內部或隱藏的表格。

DBMS_GOLDENGATE_ADM 包含下列設定最早與最新時戳解析的程序:

ADD_AUTO_CDR() 和 ALTER_AUTO_CDR() 中的欄位 ADDITIONAL_OPTIONS 會開啟使用最早的時間戳記。開啟最早的時間戳記會自動開啟啟動多版本功能,這會新增類型時間戳記的新隱藏欄 KEYVER$$ (版本號碼)。系統會新增一個新的標誌值,以指出最早的時間戳記用途。此欄位也會新增至 DELETE TOMBSTONE 表格。刪除衝突是需要版本號碼的原因。透過最早的時間戳記解析,刪除可能透明的衝突,可能不僅會不正確地成功,可能會阻止新的資料列插入 (新版本)。使用版本時間戳記,可以針對相同列版本的列 DML 正確解析刪除。

資料列的原始插入會從其預設值接收目前的時間戳記。刪除此資料列後,便會將版本編號與插入此資料列的時間,插入刪除時的 tombstone 表格中。在新的插入中,版本號碼預設會再次接收目前的時間戳記,因此避免與 tombstone 表格中目前的刪除項目發生虛假衝突。

範例

假設您的表格 tab1 在網站 1 與網站 2 的資料庫之間全域一致。

此表格包含一個 (主要) 索引鍵。ACDR 會自動維護金鑰版本 (kv) 和時戳 (ts) 作為基礎表格 (隱藏) 和 tombstone 表格的資料欄。金鑰版本 kv 和時戳 ts

資料庫 1:insert tab1 key1 kv1 ts1

資料庫 2:delete tab1 key1 kv1 ts1

插入 DELETE TOMBSTONE 表格 key1 kv1 ts1

資料庫 1:insert tab1 key1 kv2 ts2

若未使用金鑰版本,將會忽略插入,刪除時間戳記會較早。使用金鑰版本時,您知道 kv2 不是刪除的資料列版本,而且插入會成功。

最新時戳衝突偵測與解決方法

當您在 DBMS_GOLDENGATE_ADM 套裝程式中執行 ADD_AUTO_CDR 程序來設定自動偵測 Oracle GoldenGate 衝突與解決的表格時,表格中會新增隱藏的時戳資料欄。此隱藏的時戳資料欄會記錄資料列變更的時間,而此資訊是用來偵測並解決衝突。

套用資料列 LCR 時,INSERT、UPDATE 或 DELETE 作業可能會發生衝突。下表說明每種類型的衝突及其解決方式。

作業 衝突偵測 衝突解決
INSERT 當表格的索引鍵資料欄值與資料列 LCR 中的新值相同時,就會偵測到衝突。

如果資料列 LCR 的時戳晚於表格資料列中的時戳,則資料列 LCR 中的值會取代表格中的值。

如果資料列 LCR 的時戳早於表格資料列中的時戳,則會捨棄資料列 LCR,並保留表格值。

UPDATE

在下列每一種情況中都會偵測到衝突:

  • 資料列 LCR 中的時戳值與表格中對應資料列的時戳值不相符。

  • 資料列 LCR 中資料欄群組中的舊值與對應表格資料列中的資料欄值不相符。資料欄群組是複製表格中一或多個資料欄的邏輯群組。

  • 表格資料列不存在。如果資料列在 tombstone 表格中,則這稱為更新刪除衝突。

如果值不相符且資料列 LCR 的時間戳記晚於表格資料列中的時間戳記,則資料列 LCR 中的值會取代表格中的值。

如果值不相符,且資料列 LCR 的時間戳記早於表格資料列中的時間戳記,則會捨棄資料列 LCR,並保留表格值。

如果表格資料列不存在,且資料列 LCR 的時戳晚於 tombstone 表格資料列中的時戳,則資料列 LCR 會從 UPDATE 作業轉換成 INSERT 作業,然後插入表格中。

如果表格資料列不存在,且資料列 LCR 的時間戳記早於墳墓表格資料列中的時間戳記,則會捨棄資料列 LCR。

如果表格資料列不存在,而且 tombstone 表格中沒有對應的資料列,則資料列 LCR 會從 UPDATE 作業轉換成 INSERT 作業,然後插入表格中。

DELETE

在下列每一種情況中都會偵測到衝突:

  • 資料列 LCR 中的時戳值與表格中對應資料列的時戳值不相符。

  • 表格資料列不存在。

如果資料列 LCR 的時間戳記晚於表格中的時間戳記,請從表格中刪除資料列。

如果資料列 LCR 的時間戳記早於表格中的時間戳記,則會捨棄資料列 LCR,並保留表格值。

如果刪除成功,請將資料列 LCR 插入 tombstone 表格中以記錄該資料列。

如果表格資料列不存在,請將該資料列插入 tombstone 表格中以記錄該資料列 LCR。

下列影像顯示資料庫 A 與資料庫 B 之間的衝突解決方法: 使用最新時戳方法解決最新的時戳衝突。

此範例顯示正在資料庫 A 和資料庫 B 複製的資料列。資料庫資料欄為 Name、RowTS、Office、Title 和 Salary。RowTS 資料欄是兩個資料庫中不顯示的資料欄。資料庫 A 的 Office 資料欄中有更新,同時資料庫 B 的 Title 資料欄也有更新。這會導致衝突,而此衝突的解決方法會套用最新的時間戳記方法。

差異衝突解決方式

偵測到差異衝突時,當資料列 LCR 的舊資料欄清單中的值與表格中對應資料列的值不同時,就會發生衝突。

若要設定表格的差異衝突偵測和解決方法,請在 DBMS_GOLDENGATE_ADM 套裝程式中執行 ADD_AUTO_CDR_DELTA_RES 程序。差異解析方法不取決於時間戳記或額外的解析資料欄。解決差異衝突時,會將資料列 LCR 中新舊值與舊值之間的差異新增至表格中的值,以解決衝突。此解決方法通常用於財務資料,例如帳戶餘額。例如,如果同時在兩個地點更新銀行結餘,則所有借方與貸方的融合值都會入帳。

下圖提供說明差異衝突偵測與解析的範例。

圖 2:差異衝突偵測與解決

影像的描述如下

此範例顯示正在資料庫 A 和資料庫 B 複製的資料列。Balance 資料欄會指定為執行差異衝突解決的資料欄,而 RowTS 資料欄是不顯示的時間戳記資料欄,用來追蹤 Balance 資料欄的每個變更時間。在兩個資料庫的資料列中,會幾乎同時變更 Balance 值 (資料庫 A 中的 @T20 和資料庫 B 中的 @T22)。這些變更會導致衝突,而差異衝突解決方式則用於以下列方式解決衝突:

在差異衝突解決之後,在資料庫 A 和資料庫 B 的資料列中,Balance 資料欄的值是相同的。

地點優先順序 CDR

注意:SITE PRIORITY 解析的優先順序高於所有 COLUMN GROUP 解析設定值。

注意:如果 SITE PRIORITY Replicat 參數未放置在參數檔中適用的 map 敘述句之前,它就無法運作。此參數必須放置在適用的對應陳述式之前。

在 Replicat 參數檔中指定衝突解決方法的優先順序。

Replicat 參數檔中的資料庫或 PDB 已啟用 SITE PRIORITY,參數為 ACDR SITE_PRIORITY {source_db_name}{OVERWRITE | IGNORE },此參數指定為開啟表格的 SITE PRIORITY 解析。

如果指定 OVERWRITE 選項,則來源表格會採用優先順序,而衝突會由 OVERWRITE 解決。相反地,如果指定 IGNORE 選項,則目標表格會取得優先順序,而來源表格變更則會在衝突中忽略。

DBMS_GOLDENGATE_ADM 套裝程式中 ADD_AUTO_CDR() 程序的欄位 ADDITIONAL_OPTIONS 可以停用 SITE PRIORITY 解析,設定 IGNORE_SITE_PRIORITY 則可停用 ALTER_AUTO_CDR()。

每個 Replicat 來源與目標關係的設定都可以不同,因此收斂取決於使用者設定。

刪除一律勝出時間戳記 CDR

DELETE ALWAYS WINS 可透過 DBMS_GOLDENGATE_ADM 程序 ADD_AUTO_CDR() 和 ALTER_AUTO_CDR() 中的欄位 ADDITIONAL_OPTIONS 啟用。這又是刪除衝突解決方法,未使用最新的時戳解析,因此需要啟動多版本功能。開啟 DELETE ALWAYS WINS 會自動開啟啟動多版本功能,以新增類型時戳的新隱藏資料欄 KEYVER$$ (版本號碼)。新的旗標值也會新增至 acdrflags_kqldtvc,以表示 DELETE ALWAYS WINS 的用法。此欄位也會新增至 DELETE TOMBSTONE 表格。有與 EARLIEST TIMESTAMP 解析相同的版本問題存在。

範例:

金鑰版本 kv 和時戳 ts

資料庫 1:insert tab1 key1 kv1 ts1

資料庫 2:delete tab1 key1 kv1 ts1

插入至 DELETE TOMBSTONE 表格 key1 kv1 ts1

資料庫 1:insert tab1 key1 kv2 ts2

若未使用金鑰版本,將會忽略插入,刪除一律勝出。使用金鑰版本時,您知道 kv2 不是刪除的資料列版本,而且插入會成功。

DELETE TOMBSTONE 表格

DELETE TOMBSTONE 表格是刪除記錄的標記,用以區分記錄與從未存在的記錄。DELETE TOMBSTONE 表格至少包含索引鍵資料欄和作業時戳。刪除收斂需要此資訊,因為某些傳入的更新和插入可能會從其他網站延遲,而傳入的 LCR 必須根據 tombstone 作業時間戳記進行篩選,以判斷是否應套用。

在 Delete Tombstone 追蹤主索引鍵更新

完整支援主索引鍵 (PK) 更新需要處理由索引鍵之前影像和索引鍵之後影像所代表之資料列的衝突。PK 更新是自主的刪除和插入,因此,PK 更新衝突必須被支援為刪除,以與金鑰的前一個影像衝突,並插入金鑰的後一個影像 (和資料列)。

支援 PK 更新作為刪除索引鍵之前影像所代表的資料列,表示它應該插入刪除的 tombstone 表格中作為刪除。當 PK 更新時,會新增更新內部觸發程式以插入至 tombstone 表格中 (實際上是資料列識別索引鍵,如果 PK 存在,或選擇的 UK 至少有一個不可為空值的資料欄)。由於主索引鍵更新可能會導致兩個衝突,最多會在資料列層次嘗試兩個解析,因此會刪除具有原始主索引鍵的資料列,然後插入具有新主索引鍵的資料列。

範例:使用最新的時戳解析

資料庫 1:更新為 tab1 key1 at ts1

資料庫 2:更新為 tab1 key1 set key1 to key2 ts2

資料庫 3:更新為 tab1 key2 ts3

在此案例中,它會顯示在資料列層次 tab1 資料列中應刪除 key1,而資料庫 3 更新應是 tab1 資料列索引鍵的最終修改

  1. 如果資料庫 2 位於 ts3,而資料庫 3 位於 ts3,則資料庫 2 的主索引鍵更新會是 tab1 資料列 key2 的最終修改。

現在,假設資料庫 1 位於 ts3、資料庫 2 (位於 ts2) 以及資料庫 3 (位於 ts1) 的情況,則更新至資料庫 1 上的 tab1 資料列 key1 應該會成功,而從資料庫 2 (位於 tab1 資料列 key2) 的主索引鍵更新應該會成功。此時,它看起來像是完整解析度,是必須分別解析之前影像的刪除和之後影像的插入。這意味著它們彼此無關,而彼此的損失不是兩者之間的損失。

設定差異衝突偵測與解決方法

DBMS_GOLDENGATE_ADM 套裝軟體中的 ADD_AUTO_CDR_DELTA_RES 程序可設定差異衝突偵測與解析。

使用差異衝突解決方法,您可以指定一個資料欄來偵測並解決衝突。如果資料列 LCR 中的資料欄值與表格中的對應值不相符,就會偵測到衝突。將資料列 LCR 中新值與舊值之間的差異新增至表格中的值,即可解決衝突。

您可以使用 DBMS_GOLDENGATE_ADM 套裝程式中的 GRANT_ADMIN_PRIVILEGE 程序來設定 Oracle GoldenGate 管理員。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 ADD_AUTO_CDR 程序並指定要設定最新時戳衝突偵測與解決方式的表格。

  3. 執行 ADD_AUTO_CDR_DELTA_RES 程序,並指定要執行差異衝突偵測和解決的資料欄。

  4. 在每個複製表格的 Oracle AI Database 中重複上述步驟。

範例 9-23 設定表格的差異衝突偵測與解決方法

此範例會為 oe.orders 表格中的 order_total 資料欄設定差異衝突偵測和解析。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

設定最新的時戳衝突偵測與解決方法

DBMS_GOLDENGATE_ADM 套裝軟體中的 ADD_AUTO_CDR 程序可設定最新的時戳衝突偵測與解析。ADD_AUTO_CDR_COLUMN_GROUP 程序會新增選擇性資料欄群組。

對於 Oracle AI Database 26ai 和更新版本,有管理和維護 ACDR 設定表格的其他方法。您可以將相關 AUTO-CDR 相關資料欄保留為 UNUSED 資料欄,或是在呼叫 REMOVE_AUTO_CDR 程序之後立即刪除。

如果您將 ADD_AUTO_CDR 程序套用至表格,則在移除 AUTO_CDR 時,其內部資料欄預設會標示為未使用。呼叫 REMOVE_AUTO_CDR 之後,可以在稍後階段手動刪除未使用的資料欄,或是使用一些其他參數立即移除。如需詳細資訊,請參閱從表格移除衝突偵測與解決。

若要深入瞭解,請參閱 Oracle AI Database PL/SQL Packages and Types Reference 中的 ADD_AUTO_CDR Procedure

使用最新的時戳衝突偵測與解決方法時,當資料列 LCR 的時戳資料欄與對應表格資料列的時戳不符時,就會偵測到衝突。如果資料列 LCR 的時間戳記較晚,則會套用該資料列。否則,會捨棄資料列 LCR,而不會變更表格資料列。當您執行 ADD_AUTO_CDR 程序時,它會為指定表格中的每個資料列新增一個不顯示的時戳資料欄,並設定時戳衝突偵測和解決方法。當您使用 ADD_AUTO_CDR_COLUMN_GROUP 程序新增一或多個資料欄群組時,它會為資料欄群組新增時戳,並為資料欄群組設定時戳衝突偵測和解決方法。

您可以使用 DBMS_GOLDENGATE_ADM 套裝程式中的 GRANT_ADMIN_PRIVILEGE 程序來設定 Oracle GoldenGate 管理員。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 ADD_AUTO_CDR 程序並指定要設定最新時戳衝突偵測與解決方式的表格。

  3. 執行 ADD_AUTO_CDR_COLUMN_GROUP 程序,並在表格中指定一或多個資料欄群組。

  4. 在每個複製表格的 Oracle AI Database 中重複上述步驟。

範例 9-24 設定表格的最新時戳衝突偵測與解決方法

此範例會為 hr.employees 表格設定最新的時戳衝突偵測和解決方法。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'HR',
    TABLE_NAME  => 'EMPLOYEES');
END;
/

範例 9-25 設定資料欄群組

此範例會設定下列資料欄群組,以解決 HR.EMPLOYEES 表格上的時戳衝突:

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_LIST       => 'JOB_ID, DEPARTMENT_ID, MANAGER_ID',
    COLUMN_GROUP_NAME => 'JOB_IDENTIFIER_CG');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_LIST       => 'SALARY, COMMISSION_PCT',
    COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;
/

設定差異衝突偵測與解決方法

DBMS_GOLDENGATE_ADM 套裝軟體中的 ADD_AUTO_CDR_DELTA_RES 程序可設定差異衝突偵測與解析。

使用差異衝突解決方法,您可以指定一個資料欄來偵測並解決衝突。如果資料列 LCR 中的資料欄值與表格中的對應值不相符,就會偵測到衝突。將資料列 LCR 中新值與舊值之間的差異新增至表格中的值,即可解決衝突。

您可以使用 DBMS_GOLDENGATE_ADM 套裝程式中的 GRANT_ADMIN_PRIVILEGE 程序來設定 Oracle GoldenGate 管理員。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 ADD_AUTO_CDR 程序並指定要設定最新時戳衝突偵測與解決方式的表格。

  3. 執行 ADD_AUTO_CDR_DELTA_RES 程序,並指定要執行差異衝突偵測和解決的資料欄。

  4. 在每個複製表格的 Oracle AI Database 中重複上述步驟。

範例 9-26 設定表格的差異衝突偵測與解決方法

此範例會為 oe.orders 表格中的 order_total 資料欄設定差異衝突偵測和解析。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

管理自動衝突偵測與解決方法

您可以使用 DBMS_GOLDENGATE_ADM 套裝程式,在 Oracle AI Database 中管理 Oracle GoldenGate 自動衝突偵測與解決。

更改表格的衝突偵測與解決方法

DBMS_GOLDENGATE_ADM 套裝軟體中的 ALTER_AUTO_CDR 程序可變更表格的衝突偵測與解決方式。

必須為表格設定 Oracle GoldenGate 自動衝突偵測和解決方法:

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 ALTER_AUTO_CDR 程序並指定要設定最新時戳衝突偵測與解決方式的表格。

  3. 在每個複製表格的 Oracle AI Database 中重複上述所有步驟。

範例 9-27 更改表格的衝突偵測與解決方法

此範例會變更 HR.EMPLOYEES 表格的衝突偵測與解決方法,以指定在 tombstone 表格中追蹤刪除衝突。

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    TOMBSTONE_DELETES => TRUE);
END;
/

變更資料欄群組

ALTER_AUTO_CDR_COLUMN_GROUP 程序會變更資料欄群組。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 ALTER_AUTO_CDR_COLUMN_GROUP 程序,並在表格中指定一或多個資料欄群組。

  3. 在每個複製表格的 Oracle AI Database 中重複上述所有步驟。

範例 9-28 更改資料欄群組

此範例會將 MANAGER_ID 資料欄從 HR.EMPLOYEES 表格的 JOB_IDENTIFIER_CG 資料欄群組中移除。

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME        => 'HR',
    TABLE_NAME         => 'EMPLOYEES',
    COLUMN_GROUP_NAME  => 'JOB_IDENTIFIER_CG',
    REMOVE_COLUMN_LIST => 'MANAGER_ID');
END;
/

注意:如果有一個以上的資料欄,請使用逗號區隔的清單。

清除 Tombstone 資料列

PURGE_TOMBSTONES 程序會移除在指定日期與時間之前記錄的 tombstone 資料列。此程序會移除資料庫中為衝突解決所設定之所有表格的 tombstone 資料列。

可能需要定期清除 tombstone 資料列,讓 tombstone 日誌隨著時間的推移而成長過大。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 PURGE_TOMBSTONES 程序,並指定日期與時間。

範例 9-29 清除 Tombstone 資料列

此範例會清除 2015 年 12 月 1 日美國東部標準時間下午 3:00 之前記錄的所有 tombstone 列。時間戳記必須以 TIMESTAMP WITH TIME ZONE 格式輸入。

EXEC DBMS_GOLDENGATE_ADM.PURGE_TOMBSTONES('2015-12-01 15:00:00.000000 EST');

ACDR 表格的線上重新定義

使用 DBMS_REDEFINITION 套裝程式重組表格或資料欄時,Oracle AI Database 允許減輕應用程式互動。DBMS_REDEFINITION 套裝軟體可用來執行下列作業:

DBMS_REDFINITION.START_REDEF_TABLE 會自動管理暫時表格的隱藏時戳資料欄。

如需 DBMS_REDFINITION 套件的詳細資訊,請參閱 Oracle AI Database PL/SQL Packages and Types Reference 中的 DBMS_REDEFINITION 。

從表格移除衝突偵測與解決方法

使用 Oracle AI Database 和更新版本時,完全從表格中移除「自動衝突偵測與解決 (ACDR)」,對表格的影響較小,因為如果移除 AUTO_CDR,AUTO_CDR 相關資料欄會標示為 UNUSED。

呼叫 REMOVE_AUTO_CDR 程序之後,就可以在維護時段中手動刪除未使用的資料欄。這對於 ALTER TABLE ... DROP COLUMN 作業需要大量資源的大型表格非常有用。

若要在呼叫 REMOVE_AUTO_CDR 程序時立即移除所有 AUTO_CDR 內部資料欄,您必須先使用 ADD_AUTO_CDR 或 ALTER_AUTO_CDR 程序的 additional_options 參數 REMOVE_HIDDEN_COLUMNS 標示表格。

使用 DBMS_GOLDENGATE_ADM 套裝軟體中的 REMOVE_AUTO_CDR 程序,將表格標記為 UNUSED,如此可將封鎖降到最低。您可以選擇刪除資料欄或保留在較晚的階段。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 REMOVE_AUTO_CDR 程序並指定表格。

  3. 在每個複製表格的 Oracle AI Database 實例中,重複上述所有步驟。

範例 9-30 移除表格的衝突偵測與解決方法

此範例會移除 HR.EMPLOYEES 表格的衝突偵測與解決方法。

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR(
    SCHEMA_NAME => 'HR',
    TABLE_NAME  => 'EMPLOYEES');
END;
/

您可以在 ADD_AUTO_CDR 程序中選擇使用 ADD_AUTO_CDR.REMOVE_HIDDEN_COLUMNS 旗標作為 additional_flags 參數來刪除資料欄。

以下是您可以用來檢視表格中隱藏資料欄的範例。

下列查詢使用 DBA_UNUSED_COL_TABS 套裝程式來判斷 EMPLOYEES 表格中是否有未使用的資料欄。

SELECT OWNER, TABLE_NAME, COUNT
  FROM DBA_UNUSED_COL_TABS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  ORDER BY OWNER, TABLE_NAME;

輸出顯示如下:

OWNER        TABLE_NAME    COUNT
--------    ------------ ----------
HR            EMPLOYEES      1

下列查詢列出移除 EMPLOYEES 表格中資料欄群組的 ACDR 時,系統所標記的隱藏資料欄。

SELECT OWNER, TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE, HIDDEN_COLUMN
  FROM DBA_TAB_COLS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  AND HIDDEN_COLUMN = 'YES' AND USER_GENERATED= 'NO'
  ORDER BY OWNER, TABLE_NAME, COLUMN_ID;

輸出顯示如下:

OWNER        TABLE_NAME    COLUMN_ID  COLUMN_NAME      DATA_TYPE     HIDDEN_COLUMN
------------ ------------ ---------- -------------    ------------ ---------------
HR           EMPLOYEES    SYS_C00014_22092220:30:52$   TIMESTAMP(6)       YES

移除資料欄群組

使用 Oracle AI Database 26ai 和更新版本時,移除資料欄群組的「自動衝突偵測與解決 (ACDR)」,對表格的影響較小,因為 ACDR 相關資料欄標示為 UNUSED。您也可以選擇刪除資料欄或保留在較晚的階段。

使用 DBMS_GOLDENGATE_ADM 套裝軟體中的 REMOVE_AUTO_CDR_COLUMN_GROUP 程序來標記表格,以將封鎖次數降到最低。請參閱從表格移除衝突偵測和解決中的範例。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 REMOVE_AUTO_CDR_COLUMN_GROUP 程序,並指定資料欄群組的名稱。

  3. 在每個複製表格的 Oracle AI Database 中重複上述所有步驟。

範例 9-31 移除資料欄群組

此範例會將 COMPENSATION_CG 資料欄群組從 HR.EMPLOYEES 表格中移除。

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;

移除差異衝突偵測與解決方法

DBMS_GOLDENGATE_ADM 套裝程式中的 REMOVE_AUTO_CDR_DELTA_RES 程序會移除資料欄的差異衝突偵測與解析。

必須為指定的資料欄設定差異衝突偵測與解決。

  1. 以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。

  2. 執行 REMOVE_AUTO_CDR_DELTA_RES 程序並指定資料欄。

  3. 在每個複製表格的 Oracle AI Database 中重複上述所有步驟。

範例 9-32 移除表格的差異衝突偵測與解決方法

此範例會移除 OE.ORDERS 表格中 ORDER_TOTAL 資料欄的差異衝突偵測與解析。

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;

監督自動衝突偵測與解決方法

您可以查詢資料說明視觀表,在 Oracle AI Database 中監控 Oracle GoldenGate 自動衝突偵測和解決。

顯示為衝突設定之表格的相關資訊

ALL_GG_AUTO_CDR_TABLES 視觀表會顯示為 Oracle GoldenGate 設定的表格相關資訊,自動偵測衝突並解決問題。

  1. 連線至該資料庫。

  2. 查詢 ALL_GG_AUTO_CDR_TABLES 檢視。

範例 9-33 顯示設定以進行衝突偵測和解決之表格的相關資訊

此查詢會顯示下列有關為衝突偵測與解決所設定之表格的資訊:

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN TOMBSTONE_TABLE FORMAT A15
COLUMN ROW_RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME,
       TOMBSTONE_TABLE,
       ROW_RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_TABLES
  ORDER BY TABLE_OWNER, TABLE_NAME;

您的執行結果如下:

TABLE_OWNER     TABLE_NAME      TOMBSTONE_TABLE ROW_RESOLUTION_COLUMN
--------------- --------------- --------------- -------------------------
HR              EMPLOYEES       DT$_EMPLOYEES   CDRTS$ROW
OE              ORDERS          DT$_ORDERS      CDRTS$ROW

顯示衝突解決欄的相關資訊

ALL_GG_AUTO_CDR_COLUMNS 視觀表會顯示為 Oracle GoldenGate 設定之資料欄的相關資訊,自動偵測衝突並解決問題。

您可以為資料列或資料欄設定資料欄,以自動偵測衝突並解決問題。您可以為資料欄群組中的最新時戳衝突解決設定資料欄。此外,還可以設定資料欄來解決差異衝突。

  1. 以 Oracle GoldenGate 管理員身分連線資料庫。

  2. 查詢 ALL_GG_AUTO_CDR_COLUMNS 檢視。

範例 9-34 顯示資料欄群組的相關資訊

此查詢會顯示下列有關為衝突偵測與解決所設定之表格的資訊:

COLUMN TABLE_OWNER FORMAT A10
COLUMN TABLE_NAME FORMAT A10
COLUMN COLUMN_GROUP_NAME FORMAT A17
COLUMN COLUMN_NAME FORMAT A15
COLUMN RESOLUTION_COLUMN FORMAT A23

SELECT TABLE_OWNER,
       TABLE_NAME,
       COLUMN_GROUP_NAME,
       COLUMN_NAME,
       RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_COLUMNS
  ORDER BY TABLE_OWNER, TABLE_NAME;

您的執行結果如下:

TABLE_OWNE TABLE_NAME COLUMN_GROUP_NAME COLUMN_NAME     RESOLUTION_COLUMN
---------- ---------- ----------------- --------------- -----------------------
HR         EMPLOYEES  COMPENSATION_CG   COMMISSION_PCT  CDRTS$COMPENSATION_CG
HR         EMPLOYEES  COMPENSATION_CG   SALARY          CDRTS$COMPENSATION_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG MANAGER_ID      CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG JOB_ID          CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG DEPARTMENT_ID   CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  IMPLICIT_COLUMNS$ PHONE_NUMBER    CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ LAST_NAME       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ HIRE_DATE       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ FIRST_NAME      CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMAIL           CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMPLOYEE_ID     CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_MODE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_ID        CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_DATE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ CUSTOMER_ID     CDRTS$ROW
OE         ORDERS     DELTA$            ORDER_TOTAL
OE         ORDERS     IMPLICIT_COLUMNS$ PROMOTION_ID    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_STATUS    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ SALES_REP_ID    CDRTS$ROW

在此範例中,資料欄群組名稱的 IMPLICIT_COLUMNS$ 資料欄是針對資料列衝突偵測與解決所設定,但它們不是資料欄群組的一部分。資料欄群組名稱的 DELTA$ 資料欄已設定為差異衝突偵測和解決,而且這些資料欄沒有解決資料欄。

顯示資料欄群組的相關資訊

ALL_GG_AUTO_CDR_COLUMN_GROUPS 視觀表會顯示為 Oracle GoldenGate 設定之資料欄群組的相關資訊,自動偵測衝突並解決問題。

您可以使用 DBMS_GOLDENGATE_ADM 套裝程式中的 ADD_AUTO_CDR 程序,設定 Oracle GoldenGate 自動衝突偵測與解析。您可以使用 DBMS_GOLDENGATE_ADM 套裝程式中的 ADD_AUTO_CDR_COLUMN_GROUP 程序設定資料欄群組。

  1. 以 Oracle GoldenGate 管理員身分連線資料庫。

  2. 查詢 ALL_GG_AUTO_CDR_COLUMN_GROUPS 檢視。

範例 9-35 顯示資料欄群組的相關資訊

此查詢會顯示下列有關為衝突偵測與解決所設定之表格的資訊:

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN COLUMN_GROUP_NAME FORMAT A20
COLUMN RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME,
       COLUMN_GROUP_NAME,
       RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_COLUMN_GROUPS
  ORDER BY TABLE_OWNER, TABLE_NAME;

執行結果看起來類似以下所示:

TABLE_OWNER     TABLE_NAME      COLUMN_GROUP_NAME    RESOLUTION_COLUMN
--------------- --------------- -------------------- -------------------------
HR              EMPLOYEES       COMPENSATION_CG      CDRTS$COMPENSATION_CG
HR              EMPLOYEES       JOB_IDENTIFIER_CG    CDRTS$JOB_IDENTIFIER_CG