自動衝突偵測與解析
當 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。現在會加入下列常數,這些常數代表位元旗標:
-
EARLIEST_TIMESTAMP_RESOLUTION會自動設定TOMBSTONE KEY VERSIONING -
DELETE_ALWAYS_WINS會自動設定TOMBSTONE KEY VERSIONING。 -
IGNORE_SITE_PRIORITY
下列範例在 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 AI Database 會自動建立和維護不顯示的時間戳記欄。
-
插入、更新和刪除使用刪除 tombstone 日誌表格來判斷是否刪除資料列。
-
偵測到 LOB 資料欄衝突。
-
Oracle AI Database 會自動設定必要資料欄的補充記錄日誌。
小秘訣:
另請參閱 Oracle AI Database Utilities,瞭解補充日誌記錄的相關資訊
自動衝突偵測與解析的需求
以下是設定 Oracle GoldenGate 中自動 CDR 的主要需求:
-
需要補充記錄,以確保每個資料列 LCR 都有偵測和解決衝突所需的資訊。補充記錄日誌會在對表格執行 DML 作業時,將表格資料欄的其他資訊放置在重做日誌中。設定 Oracle GoldenGate 衝突偵測與解決方法的表格時,會自動為表格中的所有資料欄設定補充日誌記錄。複製表格變更時,會將重做日誌中的其他資訊放在 LCR 中。
擷取必須用於擷取。整合式模式中的整合式 Replicat 或平行 Replicat 必須用於套用端。
LOGALLSUPCOLS應保持預設值。 -
類型為時戳的隱藏欄位
KEYVER$$可選擇性地新增至DELETE TOMBSTONE表格。此欄位是EARLIEST TIMESTAMP、DELETE ALWAYS WINS和SITE PRIORITY解析的必要欄位,也存在於基礎表格中。必須在歷程檔描述資料中以旗標或權杖形式提供基礎表格中的欄位存在。DELETE TOMBSTONE表格也支援主索引鍵更新。項目會插入原始索引鍵值資料列 (影像之前) 的DELETE TOMBSTONE表格中。Extract 中的邏輯會比對DELETE TOMBSTONE表格中的 INSERTS 與 DELETES,也必須與主索引鍵更新比對,或至少有一個不可為空值欄位 (如果沒有主索引鍵) 的唯一索引鍵 (UK)。 -
SITE PRIORITY需要 Replicat 支援後,才會實行參數並將設定值傳遞至 Replicat。 -
自動 CDR 無法與其他
MAP層次異常狀況和錯誤處理組態 (例如REPERROR、MAPEXCEPTION) 搭配使用。您可以使用「自動 CDR」或REPERROR/MAPEXCEPTION,但不能在同一個表格上同時使用兩者。請參閱TABLE \| MAP和REPERROR瞭解詳細資訊。
相容性和移轉
如果來源資料庫的基本表格未包含 KEYVER$$ 資料欄,但目標基本表格包含 DELETE 和主索引鍵更新,則目標資料庫中 EARLIEST TIMESTAMP、DELETE ALWAYS WINS 和 SITE PRIORITY 解析會發生錯誤。
從具有 KEYVER$$ 的基本表格複製到目標表格時,會忽略 KEYVER$$ 資料欄。
資料欄群組
資料欄群組是複製表格中一或多個資料欄的邏輯群組。當您新增資料欄群組時,會在資料欄群組中的資料欄與表格中的其他資料欄分別執行衝突偵測和解決。
當您使用 ADD_AUTO_CDR 程序設定 Oracle GoldenGate 衝突偵測和解決方法的表格時,表格中的所有純量資料欄都會新增至預設資料欄群組。若要定義表格的其他資料欄群組,請執行 ADD_AUTO_CDR_COLUMN_GROUP 程序。表格中不屬於使用者定義之資料欄群組的任何資料欄,都會保留在表格的預設資料欄群組中。
資料欄群組可讓不同的資料庫在幾乎相同的時間更新相同資料列中的不同資料欄,而不會造成衝突。設定表格的資料欄群組時,即使不同的資料庫更新表格中的相同資料列,也能避免衝突。如果更新會變更不同資料欄群組中資料欄的值,則不會偵測到衝突。
圖 1:資料欄群組

此範例顯示正在資料庫 A 和資料庫 B 複製的資料列。下列兩個資料欄群組是針對每個資料庫的複製表格所設定:
-
一個資料欄群組包含
Office資料欄。此資料欄群組的隱藏時戳資料欄為TS1。 -
另一個資料欄群組包含
Title和Salary資料欄。此資料欄群組的隱藏時戳資料欄為TS2。
這些欄群組可讓資料庫 A 和資料庫 B 在幾乎相同的時間更新相同列,而不會造成衝突。具體而言,會進行下列變更:
-
在資料庫 A 中,
Office的值已從1080變更為1030。 -
在資料庫 B 中,
Title的值已從MTS1變更為MTS2。
因為 Office 資料欄和 Title 資料欄位於不同的資料欄群組中,所以複製變更時不會偵測到衝突。結果就是每次複製變更之後,資料列中的值都在兩個資料庫中都是相同的。
Piecewise LOB 更新
一組由 LOB WRITE、LOB ERASE 和 LOB TRIM 組成的 LOB 作業,是一個順暢的 LOB 更新。當設定了包含 LOB 資料欄的表格進行衝突偵測與解決時,每個 LOB 資料欄都會放置在它自己的資料欄群組中,而資料欄群組則有自己的隱藏時間戳記資料欄。第一個片段 LOB 作業會更新時戳資料欄。
對於 LOB 資料欄,系統會以下列方式偵測並解決衝突:
-
如果 LOB 資料欄群組的時間戳記晚於資料列中對應的 LOB 資料欄群組,則會套用 piecewise LOB 更新。
-
如果 LOB 資料欄群組的時間戳記早於資料列中對應的 LOB 資料欄群組,則會保留表格資料列中的 LOB。
-
如果表格中沒有資料列,就會發生錯誤。
最早時戳衝突偵測與解決方法
名稱為 CDRTS$ column group 和 CDRTS$ROW 的資料欄會用來包含反映資料欄群組和資料列修改時間的時戳。
注意:含有 $ 或 $$ 符號的表格是內部或隱藏的表格。
DBMS_GOLDENGATE_ADM 包含下列設定最早與最新時戳解析的程序:
-
ADD_AUTO_CDR() -
ADD_AUTO_CDR_COLUMN_GROUP() -
REMOVE_AUTO_CDR() -
REMOVE_AUTO_CDR_COLUMN_GROUP() -
ALTER_AUTO_CDR() -
ALTER_AUTO_CDR_COLUMN_GROUP()
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 中的值會取代表格中的值。 如果值不相符,且資料列 LCR 的時間戳記早於表格資料列中的時間戳記,則會捨棄資料列 LCR,並保留表格值。 如果表格資料列不存在,且資料列 LCR 的時戳晚於 tombstone 表格資料列中的時戳,則資料列 LCR 會從 如果表格資料列不存在,且資料列 LCR 的時間戳記早於墳墓表格資料列中的時間戳記,則會捨棄資料列 LCR。 如果表格資料列不存在,而且 tombstone 表格中沒有對應的資料列,則資料列 LCR 會從 |
DELETE |
在下列每一種情況中都會偵測到衝突:
|
如果資料列 LCR 的時間戳記晚於表格中的時間戳記,請從表格中刪除資料列。 如果資料列 LCR 的時間戳記早於表格中的時間戳記,則會捨棄資料列 LCR,並保留表格值。 如果刪除成功,請將資料列 LCR 插入 tombstone 表格中以記錄該資料列。 如果表格資料列不存在,請將該資料列插入 tombstone 表格中以記錄該資料列 LCR。 |
下列影像顯示資料庫 A 與資料庫 B 之間的衝突解決方法: 
此範例顯示正在資料庫 A 和資料庫 B 複製的資料列。資料庫資料欄為 Name、RowTS、Office、Title 和 Salary。RowTS 資料欄是兩個資料庫中不顯示的資料欄。資料庫 A 的 Office 資料欄中有更新,同時資料庫 B 的 Title 資料欄也有更新。這會導致衝突,而此衝突的解決方法會套用最新的時間戳記方法。
-
在資料庫 A 中,
Office資料欄中的值會從 1080 更新為 1103 ,而 RowTS 值會從 @TS10 變更為 @TS20 。箭頭表示此變更將複製到資料庫 B。 -
在資料庫 B 中,
Title資料欄的值從 MTS1 變更為 MTS2 ,而 RowTS 值則從 @TS10 變更為 @TS22 。 -
為了解決此衝突,資料庫 B 中存在的最新時戳獲勝。這表示不會套用資料庫 A 中的變更。套用至資料庫 A 和資料庫 B 的最終值為 Scott、@TS22、1080、MTS2、100。
差異衝突解決方式
偵測到差異衝突時,當資料列 LCR 的舊資料欄清單中的值與表格中對應資料列的值不同時,就會發生衝突。
若要設定表格的差異衝突偵測和解決方法,請在 DBMS_GOLDENGATE_ADM 套裝程式中執行 ADD_AUTO_CDR_DELTA_RES 程序。差異解析方法不取決於時間戳記或額外的解析資料欄。解決差異衝突時,會將資料列 LCR 中新舊值與舊值之間的差異新增至表格中的值,以解決衝突。此解決方法通常用於財務資料,例如帳戶餘額。例如,如果同時在兩個地點更新銀行結餘,則所有借方與貸方的融合值都會入帳。
下圖提供說明差異衝突偵測與解析的範例。
圖 2:差異衝突偵測與解決

此範例顯示正在資料庫 A 和資料庫 B 複製的資料列。Balance 資料欄會指定為執行差異衝突解決的資料欄,而 RowTS 資料欄是不顯示的時間戳記資料欄,用來追蹤 Balance 資料欄的每個變更時間。在兩個資料庫的資料列中,會幾乎同時變更 Balance 值 (資料庫 A 中的 @T20 和資料庫 B 中的 @T22)。這些變更會導致衝突,而差異衝突解決方式則用於以下列方式解決衝突:
-
在資料庫 A 中,
Balance的值已從1000變更為1750。因此,該值增加了 750。 -
在資料庫 B 中,
Balance的值已從1000變更為950。因此,該值會減少 50。 -
若要解決資料庫 A 的衝突,資料列 LCR 中新值與舊值之間的差異值與表格中的值。LCR 中新值與舊值之間的差異為 (1000+750-50=1700)。表格中目前的值會增加 700,因此衝突解決後的值為 1700。
-
若要解決資料庫 B 的衝突,資料列 LCR 中新值與舊值之間的差異值與表格中的值。LCR 中新值與舊值之間的差異為 750 (1000 - 50 + 750) =1700。因此,表格 (950) 中的目前值會增加 750,以使衝突解決後的值為 1700。
在差異衝突解決之後,在資料庫 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 資料列索引鍵的最終修改
- 如果資料庫 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 管理員。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
ADD_AUTO_CDR程序並指定要設定最新時戳衝突偵測與解決方式的表格。 -
執行
ADD_AUTO_CDR_DELTA_RES程序,並指定要執行差異衝突偵測和解決的資料欄。 -
在每個複製表格的 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 管理員。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
ADD_AUTO_CDR程序並指定要設定最新時戳衝突偵測與解決方式的表格。 -
執行
ADD_AUTO_CDR_COLUMN_GROUP程序,並在表格中指定一或多個資料欄群組。 -
在每個複製表格的 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 表格上的時戳衝突:
-
JOB_IDENTIFIER_CG資料欄群組包含JOB_ID、DEPARTMENT_ID和MANAGER_ID資料欄。 -
COMPENSATION_CG資料欄群組包含SALARY和COMMISSION_PCT資料欄。
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 管理員。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
ADD_AUTO_CDR程序並指定要設定最新時戳衝突偵測與解決方式的表格。 -
執行
ADD_AUTO_CDR_DELTA_RES程序,並指定要執行差異衝突偵測和解決的資料欄。 -
在每個複製表格的 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 自動衝突偵測和解決方法:
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
ALTER_AUTO_CDR程序並指定要設定最新時戳衝突偵測與解決方式的表格。 -
在每個複製表格的 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 程序會變更資料欄群組。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
ALTER_AUTO_CDR_COLUMN_GROUP程序,並在表格中指定一或多個資料欄群組。 -
在每個複製表格的 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 日誌隨著時間的推移而成長過大。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
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,如此可將封鎖降到最低。您可以選擇刪除資料欄或保留在較晚的階段。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
REMOVE_AUTO_CDR程序並指定表格。 -
在每個複製表格的 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 程序來標記表格,以將封鎖次數降到最低。請參閱從表格移除衝突偵測和解決中的範例。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
REMOVE_AUTO_CDR_COLUMN_GROUP程序,並指定資料欄群組的名稱。 -
在每個複製表格的 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 程序會移除資料欄的差異衝突偵測與解析。
必須為指定的資料欄設定差異衝突偵測與解決。
-
以 Oracle GoldenGate 管理員身分連線至內送伺服器資料庫。
-
執行
REMOVE_AUTO_CDR_DELTA_RES程序並指定資料欄。 -
在每個複製表格的 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 設定的表格相關資訊,自動偵測衝突並解決問題。
-
連線至該資料庫。
-
查詢
ALL_GG_AUTO_CDR_TABLES檢視。
範例 9-33 顯示設定以進行衝突偵測和解決之表格的相關資訊
此查詢會顯示下列有關為衝突偵測與解決所設定之表格的資訊:
-
每個表格的表格所有者。
-
每個表格的表格名稱。
-
用來儲存因更新刪除衝突而刪除之資料列的 tombstone 表格 (如果已為表格設定 tombstone 表格)。
-
用於每個表格之衝突解決的隱藏時戳資料欄。
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 設定之資料欄的相關資訊,自動偵測衝突並解決問題。
您可以為資料列或資料欄設定資料欄,以自動偵測衝突並解決問題。您可以為資料欄群組中的最新時戳衝突解決設定資料欄。此外,還可以設定資料欄來解決差異衝突。
-
以 Oracle GoldenGate 管理員身分連線資料庫。
-
查詢
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 程序設定資料欄群組。
-
以 Oracle GoldenGate 管理員身分連線資料庫。
-
查詢
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