準備要處理的表格

您必須執行下列工作來準備表格,以便在 Oracle GoldenGate 環境中用於 Db2 LUW。


停用觸發程式和串聯限制條件

停用目標 Db2 LUW 表格上的觸發程式、連鎖刪除限制條件,以及連鎖更新限制條件。Oracle GoldenGate 會複製觸發程式或連鎖限制條件所產生的 DML。如果在目標表格上啟用相同的觸發程式或限制條件,因複製的版本而變成冗餘,且資料庫會傳回錯誤。請參考下列範例,其中來源表格為 emp_src 與 salary_src,而目標表格為 emp_targ 與 salary_targ。

  1. emp_src 會發出刪除。

  2. 它會將刪除重疊至 salary_src。

  3. Oracle GoldenGate 會將這兩個刪除項目傳送至目標。

  4. 父項刪除會先到達,並套用至 emp_targ。

  5. 父項刪除會將刪除重疊套用至 salary_targ。

  6. 從 salary_src 連鎖刪除會套用至 salary_targ 。

  7. 找不到資料列,因為該資料列已在步驟 5 中刪除。

確保表格的資料列唯一性

Oracle GoldenGate 需要來源和目標表格上某種形式的唯一資料列 ID,才能尋找正確的目標資料列以進行複製的更新和刪除。

除非在 TABLE 或 MAP 敘述句中使用 KEYCOLS 子句,否則 Oracle GoldenGate 會選取資料列 ID,以下列優先順序使用:

  1. 主索引鍵

  2. 不包含時戳或非具體化計算資料欄的第一個唯一索引鍵文數字。

  3. 如果沒有任何先前的金鑰類型存在 (即使表格中可能定義了其他類型的金鑰),Oracle GoldenGate 會建構所有資料欄的虛擬金鑰資料庫允許用於唯一金鑰,不包括金鑰中 Oracle GoldenGate 不支援的金鑰或 Oracle GoldenGate 組態中排除的金鑰。

    注意:如果表格上有其他不可使用的金鑰,或表格上沒有金鑰,Oracle GoldenGate 會將適當的訊息記錄至報表檔案。從所有資料欄建構索引鍵,代表來源系統上 Oracle GoldenGate 的效能。在目標上,此索引鍵會讓 Replicat 使用更大且更低效率的 WHERE 子句。

  4. 如果表格沒有適當的索引鍵,或者您偏好不使用現有的索引鍵,您可以定義替代索引鍵 (如果表格的資料欄一律包含唯一值)。您可以在 Extract TABLE 參數和 Replicat MAP 參數中包含 KEYCOLS 子句,以定義此替代索引鍵。指定的金鑰將會覆寫 Oracle GoldenGate 找到的任何現有主索引鍵或唯一索引鍵。請參閱 Oracle GoldenGate 的參數和函數參照中的 TABLE \| MAP 。

使用 KEYCOLS 指定自訂金鑰

如果表格沒有前述類型的資料列 ID,或者您偏好不使用這些 ID,則如果表格的資料欄一律包含唯一值,您可以定義替代索引鍵。您可以在 Extract TABLE 參數和 Replicat MAP 參數中包含 KEYCOLS 子句,以定義此替代索引鍵。指定的金鑰將會覆寫 Oracle GoldenGate 找到的任何現有主索引鍵或唯一索引鍵。

防止金鑰變更

Oracle GoldenGate 開始從表格擷取資料之後,請勿新增資料欄至索引鍵。此規則適用於主索引鍵、唯一索引鍵、KEYCOLS 索引鍵或全欄索引鍵。Db2 LUW 不會為新增至表格的資料欄提供前一個影像。如果來源上有更新索引鍵中的任何資料欄,當 Oracle GoldenGate 複製更新時,它需要一個與目標表格中目前的值比較之前的影像。

維護具體化查詢表格

為了維護來源與目標具體化查詢表格 (MQT) 之間的同位,您可以複製基礎表格,但不會複製 MQT。目標資料庫會根據 Replicat 套用至基本表格的變更來維護 MQT。

下列為設定這些表格的規則:

建立時間表格

時序表格是一種表格,可維護其資料的歷史記錄,以及其資料有效時的期間。Oracle GoldenGate 中會使用暫時表格來追蹤表格中刪除或更新的所有舊資料列。時間表也可用來維護其列與資料的業務有效性。例如,Oracle GoldenGate 會追蹤資料列有效的期間。時間表有三種類型:系統期間、應用程式期間與位元時間表。

轉換為暫時表格

您可以將已存在的表格轉換成時間表,這會變更表格的結構。本節描述表格結構如何變更。下列範例現有表格會在本節範例中轉換成所有三種時間表類型:

Table policy_info
(
Policy_id char[4] not null primary key,
Coverage int not null
              )
And the tables contains the following initial rows
                   POLICY_ID       COVERAGE
                   -------------        -----------
                     ABC                12000
                     DEF                 13000
                     ERT                 14000

範例 1 將現有表格轉換成系統期間的時間表

您可以新增 SYSTEM_PERIOD、transaction id 資料欄和 SYSTEM_TIME 期間,將範例現有表格轉換成系統期間的時序表格,如下所示:

ALTER TABLE policy_info
   ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN;
ALTER TABLE policy_info
   ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE policy_info
   ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID;
ALTER TABLE policy_info ADD PERIOD SYSTEM_TIME(sys_start, sys_end);

然後,使用下列兩種方法之一,為新的時間表格建立歷史記錄表格:

    CREATE TABLE hist_policy_info
(
 policy_id     CHAR(4) NOT NULL,

coverage     INT NOT NULL,
sys_start    TIMESTAMP(12) NOT NULL ,

sys_end      TIMESTAMP(12) NOT NULL,

ts_id            TIMESTAMP(12) NOT NULL

           );
 ALTER TABLE hist_policy_info ADD RESTRICT ON DROP;
CREATE TABLE hist_policy_info LIKE policy_info with RESTRICT ON DROP;

RESTRICT ON DROP 子句將不允許在刪除系統期間的時間表格時刪除歷史記錄表格。否則,在刪除其關聯的時間表格時,會隱含刪除歷史記錄表格。您可以在沒有 RESTRICT ON DROP. 的情況下建立歷史記錄表格無法明確刪除歷史記錄表格。

建立歷史記錄表格時,不應使用 GENERATED ALWAYS 子句。此處也不會套用系統期間時間表的主索引鍵,因為基準表中的特定資料列可能會有許多更新,而這會觸發相同主索引鍵集合歷史記錄表格中的許多插入。除此之外,記錄表的結構應與其關聯的系統期間時間表完全相同。歷史記錄表格的資料欄數目和順序必須與系統期間的時間表格相同。無法明確新增、刪除或變更歷史記錄表格資料欄。您必須將系統期間的時間表與其記錄表與下列陳述式建立關聯:

ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info.

表格的 GENERATED ALWAYS 資料欄是一律由資料庫管理員填入的資料欄,因此您無法控制這些資料欄。資料庫管理員會根據系統時間來植入這些欄。

額外新增的 SYSTEM_PERIOD 和 transaction id 資料欄將會有現有資料列的預設值,如下所示:

POLICY_ID                                   COVERAGE    SYS_START                                         SYS_END                                                TS_ID

--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC             12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
DEF             13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
ERT             14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000

在您開始更新時間表後,相關的記錄表會植入之前的影像。

範例 2 將現有表格轉換成應用程式期間的時間表

您可以新增時間資料欄和 BUSINESS_TIME 期間,將範例現有表格轉換成應用程式期間的時序表格,如下所示:

ALTER TABLE policy_info ADD COLUMN bus_start DATE NOT NULL DEFAULT '10/10/2001'"
ALTER TABLE policy_info ADD COLUMN bus_end DATE NOT NULL DEFAULT '10/10/2002'
ALTER TABLE policy_info ADD PERIOD BUSINESS_TIME(bus_start, bus_end)

新增時間資料欄時,您必須確定在輸入現有時間資料欄的商業有效性時間值時,bus_start 資料欄的值一律小於 bus_end,因為這些資料欄會指定資料列的商業有效性。

新的應用程式期間時間表看起來會類似於:

POLICY_ID   COVERAGE    BUS_START  BUS_END
--------- ----------- ---------- -------------------------------
ERT             14000              10/10/2001  10/10/2002
DEF             13000             10/10/2001   10/10/2002
ABC             12000             10/10/2001   10/10/2002

範例 3 將現有表格轉換成位元時間表格

您可以新增 SYSTEM_PERIOD、時間資料欄以及 SYSTEM_TIME 和 BUSINESS_TIME 期間,將範例現有表格轉換成位元時序表格,如下所示:

ALTER TABLE policy_info
   ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN;
ALTER TABLE policy_info
   ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE policy_info
   ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID;
ALTER TABLE policy_info ADD PERIOD SYSTEM_TIME(sys_start, sys_end);

ALTER TABLE policy_info ADD COLUMN bus_start DATE NOT NULL DEFAULT '10/10/2001'"
ALTER TABLE policy_info ADD COLUMN bus_end DATE NOT NULL DEFAULT '10/10/2002'
ALTER TABLE policy_info ADD PERIOD BUSINESS_TIME(bus_start, bus_end)

新增時間資料欄時,您必須確定在輸入現有時間資料欄的商業有效時間值時,bus_start 資料欄的值一律小於 bus_end,因為這些資料欄會指定資料列的商業有效性。

然後,使用下列兩種方法之一,為新的時間表格建立歷史記錄表格:

    CREATE TABLE hist_policy_info
(
 policy_id     CHAR(4) NOT NULL,

coverage     INT NOT NULL,
sys_start    TIMESTAMP(12) NOT NULL ,

sys_end      TIMESTAMP(12) NOT NULL,

ts_id            TIMESTAMP(12) NOT NULL

           );
 ALTER TABLE hist_policy_info ADD RESTRICT ON DROP;
CREATE TABLE hist_policy_info LIKE policy_info with RESTRICT ON DROP;
ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info.

表格的 GENERATED ALWAYS 資料欄是一律由資料庫管理員填入的資料欄,因此您無法控制這些資料欄。資料庫管理員會根據系統時間來植入這些欄。

額外新增的 SYSTEM_PERIOD 和 transaction id 資料欄將會有現有資料列的預設值,如下所示:

POLICY_ID                                   COVERAGE    SYS_START                                         SYS_END                                                TS_ID

--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC             12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
DEF             13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
ERT             14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000

在您開始更新時間表後,相關的記錄表會植入之前的影像。

額外新增的 SYSTEM_TIME 期間、交易 ID 及時間資料欄將具有現有資料列的預設值,如下所示:

POLICY_ID COVERAGE    SYS_START                        SYS_END                          TS_ID                            BUS_START         BUS_END
--------- ----------- -------------------------------- -------------------------------- -------------------------------- ---------- -------------------------------------
ABC   12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
DEF             13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
ERT             14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002

使用者開始更新時序表格後,歷史記錄表格就會填入之前影像。

異質環境中的範例 4 複製。

在異質組態中,您在套用端沒有時序表格,您只能透過不關聯的歷史記錄表格來複製系統期間和位元時間表格。在此情況下執行複製時,您必須處理 SYSTEM_PERIOD 和交易 ID 資料欄值。這些資料欄將有一些目標資料庫可能不支援的值。您應先使用對應轉換函數,將這些值轉換成目標資料庫支援的格式,然後對應欄。

例如,MySQL 的 DATETIME 範圍從 1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999。您無法將時間戳記值 0001-01-01-00.00.00.000000000000 複製到 MySQL。若要複製這類值,您必須將這個值轉換成 MySQL DATETIME 值 1000-01-01 00:00:00.000000,然後對應資料欄。如果您在 policy_info 系統期間表格中有下列資料列:

POLICY_ID                                   COVERAGE    SYS_START                                         SYS_END                                                TS_ID
--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC             12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000

若要將資料列複製到 MySQL,您可以使用 colmap() 函數:

map *source_schema*.policy_info, target *target_schema*.policy_info colmap
(policy_id=policy_id, coverage=coverage, sys_start= @IF( ( @NUMSTR( @STREXT(sys_
start,1,4))) > 1000, sys_start, '1000-01-01 00.00.00.000000'), sys_end=sys_end,
 ts_id= @IF( ( @NUMSTR( @STREXT(ts_id,1,4))) > 1000, ts_id, '1000-01-01
 00.00.00.000000'));

以時序表格複製

您可以選擇下列其中一種方法來複製系統期間或位元時間表格,如下所示:

使用預設複製作為 SYSTEM_TIME 期間時,Oracle GoldenGate 無法偵測並解決衝突,而 transactionstart id 資料欄則維持自動產生。無法在 set 和 where 子句中指定這些資料欄。如果您使用 SUPPRESSTEMPORALUPDATES 參數,則 Oracle GoldenGate 支援 CDR。