DDL

有效對象

擷取與 Replicat

注意:只有在 Oracle 與 Oracle 資料庫之間以及 MySQL 到 MySQL 資料庫之間,才支援 DDL 複製。

說明

使用 DDL 參數執行下列作業:

若不使用選項使用,DDL 參數不會執行篩選,而且會傳輸所有 DDL 作業,如下所示:

與選項搭配使用時,DDL 參數會作為篩選代理程式,根據下列項目來包括或排除 DDL 作業:

參數檔中只能使用一個 DDL 參數,但您可以結合多個內含與排除選項,將 DDL 篩選為必要的層次。

注意:請勿將 DDL 參數用於 Extract 資料汲取。這些處理類型不允許對應或轉換 DDL,且會自動以傳遞模式傳輸 DDL 記錄。在來源表格上執行的 DDL (例如 ALTER TABLE TableA...) 將由 Replicat 以相同的表格名稱 (ALTER TABLE TableA) 套用。無法將它對應為 ALTER TABLE TableB。

如需有關如何使用 Oracle GoldenGate DDL 支援的其他資訊,請參閱 Oracle GoldenGate Microservices Documentation 中的 Oracle:DDL Replication 和 MySQL:DDL Replication 。

語法

DDL [
{AUTOSCHEMA}
{INCLUDE | EXCLUDE}
  [, ALLOWEMPTYOBJECT]
  [, ALLOWEMPTYOWNER]
  [, MAPPED | UNMAPPED | OTHER | ALL]
  [, OPTYPE <type>]
  [, OBJTYPE '<type>']
  [, OBJNAME <name>]
  [, INSTR '<string>']
  [, INSTRWORDS '<word_list>']
  [, INSTRCOMMENTS '<comment_string>']
  [, INSTRCOMMENTSWORDS '<word_list>']
  [, SOURCECATALOG <catalog> | ALLCATALOGS]
  [, STAYMETADATA]
  [, EVENTACTIONS (<action>)]
]
[...]

AUTOSCHEMA

適用於將 MySQL 中的 Replicat 複製到 Oracle、Oracle 至 MySQL,以及將 MySQL 複製到 MySQL 資料。

DDL AUTOSCHEMA 參數選項可用來啟用自動綱要發展功能。依預設,會停用此選項。

語法

DDL AUTOSCHEMA

只有 MAPPED DDL 作業與「自動綱要發展」相關。因此,在包含 / 排除條件中指定為 OBJNAME 子句一部分的物件名稱應與目標表格名稱 (而非來源表格名稱) 對應。

在 Replicat 參數檔中使用 OBJNAME 與 MAPPED 時,OBJNAME 的值必須參照 MAP 敘述句之 TARGET 子句所指定的名稱。

如需詳細資訊,請參閱使用自動綱要發展。

INCLUDE | EXCLUDE

DDL 篩選選項

下列語法選項允許篩選並操作 Oracle GoldenGate 所複製的 DDL。這些選項適用於 DDL 參數的 INCLUDE 和 EXCLUDE 子句,以及其他支援 DDL 複製的參數。

使用 INCLUDE 或 EXCLUDE 來識別包含或排除子句的開頭。

包含或排除子句必須包含 INCLUDE 或 EXCLUDE 關鍵字,後面接著 DDL 參數之其他篩選選項的任何有效組合。

如果使用 EXCLUDE,則必須建立對應的 INCLUDE 子句。例如,下列項目無效:

DDL EXCLUDE OBJNAME "hr".*

不過,您可以使用下列其中一種方法:

DDL INCLUDE ALL, EXCLUDE OBJNAME "hr"."*"
DDL INCLUDE OBJNAME fin.* EXCLUDE OBJNAME "fin.ss"

EXCLUDE 的優先順序高於任何包含相同準則的 INCLUDEs。您可使用多個包含與排除條款。

請勿在 DDL 參數、TABLE 參數或 MAP 參數中,或 TABLEEXCLUDE 或 MAPEXCLUDE 參數中包含任何安裝 DDL 物件的 Oracle GoldenGate。確定這些參數中的萬用字元設定不包括 Oracle GoldenGate 安裝的 DDL 物件。這些物件不能是 Oracle GoldenGate 組態的一部分,但 Extract 處理作業必須瞭解它們的作業,因此您不能在 EXCLUDE、TABLEEXCLUDE 或 MAPEXCLUDE 參數敘述句的組態中明確排除這些物件。

ALLOWEMPTYOBJECT

使用 ALLOWEMPTYOBJECT 可允許 OBJNAME 規格處理不含物件名稱的 DDL。舉例而言:

DDL INCLUDE OBJNAME sch.* ALLOWEMPTYOBJECT

ALLOWEMPTYOWNER

使用 ALLOWEMPTYOWNER 可允許 OBJNAME 規格處理不含擁有者名稱的 DDL。舉例而言:

DDL INCLUDE OBJNAME pdb.sch.* ALLOWEMPTYOWNER

EVENTACTIONS (action)

造成 Extract 或 Replicat 處理作業會根據交易日誌或歷程檔 (亦稱為事件記錄) 中的 DDL 記錄,採取定義的動作。如果 DDL 記錄適合由 Extract 或資料汲取寫入歷程檔,或由 Replicat 執行 (由 DDL 參數的其他篩選選項決定),則會觸發 DDL 事件。您可以使用此系統,根據資料庫事件來自訂處理。

如需 <action>,請參閱 MAP 和 TABLE 參數底下的 EVENTACTIONS。

在 DDL 記錄上使用 EVENTACTIONS 的準則:

EVENTACTIONS 不支援下列 DDL 物件,因為它們是衍生的物件:

MAPPED | UNMAPPED | OTHER | ALL

使用 MAPPED、UNMAPPED、OTHER 和 ALL,根據 DDL 作業範圍套用 INCLUDE 或 EXCLUDE。

DDL EXCLUDE ALL 是特殊的處理選項,可維護 Oracle GoldenGate 的最新物件描述資料,同時封鎖 DDL 作業本身的複製。使用 Oracle GoldenGate 以外的方法將 DDL 套用至目標時,可以使用 DDL EXCLUDE ALL,但您希望 Oracle GoldenGate 將資料變更複製到目標物件。它會在物件變更時提供目前的描述資料給 Oracle GoldenGate,因此不需要停止和啟動 Oracle GoldenGate 處理作業。下列特殊條件適用於 DDL EXCLUDE ALL:

OBJNAME name

使用 OBJNAME 將 INCLUDE 或 EXCLUDE 套用至物件的完整名稱。若要正確指定兩部分的物件名稱和萬用字元,請參閱在命令引數中使用萬用字元。

將區分大小寫的物件名稱放在雙引號內。

不區分大小寫的範例:

DDL INCLUDE OBJNAME accounts.*

區分大小寫的範例:

DDL INCLUDE OBJNAME accounts."cust"

請勿在 Oracle USER 物件使用 OBJNAME,因為 OBJNAME 預期為 <owner.object> 或 <container.owner.object>,而 USER 則只包含綱要。

在 Replicat 參數檔中使用 OBJNAME 與 MAPPED 時,OBJNAME 的值必須參照 MAP 敘述句之 TARGET 子句所指定的名稱。例如,提供下列 MAP 陳述式時,正確的值為 OBJNAME fin2.*。

MAP fin.exp_*, TARGET fin2.*;

在下列範例中,CREATE TABLE 敘述句的執行方式如下 <source>:

CREATE TABLE fin.exp_phone;

該相同敘述句的執行方式如下:

CREATE TABLE fin2.exp_phone;

如果未在 MAP 敘述句中指定目標擁有者,Replicat 會將其對應至使用 USERIDALIAS 參數指定的資料庫使用者。

對於建立衍生物件 (例如觸發程式) 的 DDL,OBJNAME 的值必須是基礎物件的名稱,而不是衍生物件的名稱。

例如,若要包含下列 DDL 陳述式,正確的值為 hr.accounts,而非 hr.insert_trig。

CREATE TRIGGER hr.insert_trig ON hr.accounts;

對於 RENAME 作業,OBJNAME 的值必須是新的表格名稱。例如,若要包含下列 DDL 陳述式,正確的值為 hr.acct。

ALTER TABLE hr.accounts RENAME TO acct;

OBJTYPE <type>

使用 OBJTYPE,將 INCLUDE 或 EXCLUDE 套用至特定類型的資料庫物件。對於 <type>,請使用任何對資料庫有效的物件類型,例如 TABLE、INDEX 和 TRIGGER。對於 Oracle 具體化視觀表和具體化視觀表日誌,正確的類型分別是 snapshot 和 snapshot log。將物件類型名稱放在單引號內。舉例而言:

DDL INCLUDE OBJTYPE 'INDEX'
DDL INCLUDE OBJTYPE 'SNAPSHOT'

對於 Oracle 物件類型 USER,請勿使用 OBJNAME 選項,因為 OBJNAME 預期為 owner.object 或 <container.owner.object>,而 USER 僅有綱要。

OPTYPE <type>

使用 OPTYPE 將 INCLUDE 或 EXCLUDE 套用至特定類型的 DDL 作業,例如 CREATE、ALTER 和 RENAME。對於 <type>,請使用任何對資料庫有效的 DDL 命令。例如,若要包含 ALTER 作業,正確的語法為:

DDL INCLUDE OPTYPE ALTER

INSTR string

使用 INSTR 將 INCLUDE 或 EXCLUDE 套用至指令語法本身內包含特定字元字串的 DDL 敘述句,但不在註解內。例如,下列排除可建立索引的 DDL。

DDL INCLUDE ALL EXCLUDE INSTR 'CREATE INDEX'

將字串放在單引號內。這種搜尋並不區分大小寫。

INSTR 不支援字串中的單引號 (' '),也不支援 NULL 值。

INSTRCOMMENTS comment_string

(適用於 Oracle) 使用 INSTRCOMMENTS 將 INCLUDE 或 EXCLUDE 套用至註解內包含特定字元字串,但不在 DDL 命令本身內的 DDL 敘述句。透過使用 INSTRCOMMENTS,您可以使用註解作為篩選代理程式。

例如,下列排除註解中包含字串 'source only' 的 DDL 敘述句。

DDL INCLUDE ALL EXCLUDE INSTRCOMMENTS 'SOURCE ONLY'

在本範例中,不會複製以下的 DDL 陳述式。

CREATE USER john IDENTIFIED BY john /<source only>/;

將字串放在單引號內。這種搜尋並不區分大小寫。您可以結合 INSTR 和 INSTRCOMMENTS 來篩選命令語法中的字串,以及在同一個 DDL 敘述句的註解中。

INSTRCOMMENTS 不支援字串中的單引號 (' '),也不支援 NULL 值。

INSTRWORDS word_list

使用 INSTRWORDS 將 INCLUDE 或 EXCLUDE 套用至包含指定文字的 DDL 敘述句。

若為 <word_list>,請在單引號內以任何順序提供字詞。若要包含空格,請在雙引號中加上空格 (和文字,如果適用)。雙引號也可用於括住句子。

所有指定的文字都必須出現在 DDL 中,INSTRWORDS 才會生效。

範例:

DDL INCLUDE OPTYPE ALTER OBJTEYP 'TABLE' INSTRWORDS 'ALTER CONSTRAINT " xyz"'

此範例符合下列 DDL 陳述式:

ALTER TABLE ADD CONSTRAINT xyz CHECK
ALTER TABLE DROP CONSTRAINT xyz

INSTRWORDS 不支援字串中的單引號 (' '),也不支援 NULL 值。

INSTRCOMMENTSWORDS word_list

(適用於 Oracle) 的運作方式與 INSTRWORDS 相同,但僅適用於 DDL 敘述句內的註解,而非 DDL 語法本身。透過使用 INSTRCOMMENTS,您可以使用註解作為篩選代理程式。

INSTRCOMMENTSWORDS 不支援字串中的單引號 (' '),也不支援 NULL 值。

您可以結合 INSTRWORDS 和 INSTRCOMMENTSWORDS 來篩選命令語法中的字串,以及在同一個 DDL 敘述句的註解中。

SOURCECATALOG catalog | ALLCATALOGS

您可以使用這些選項來指定 OBJNAME 子句中不合格的物件名稱如何解析成正確的容器。當來源資料庫是 Oracle 容器資料庫時,請使用這些選項。

SOURCECATALOG 會指定相同 INCLUDE 或 EXCLUDE 子句中指定之所有物件名稱的預設容器。若要生效,必須先指定 SOURCECATALOG,再指定 OBJNAME 規格。請參閱 "SOURCECATALOG " 以瞭解詳細資訊,包括使用包含兩部分名稱的敘述句,其中需要三部分物件名稱才能完全識別物件。

ALLCATALOGS 指定解析相同 INCLUDE 或 EXCLUDE 子句中指定的物件名稱時,應考慮資料庫的所有容器。ALLCATALOGS 可以放在 OBJNAME 規格之前或之後。

以下為當參數檔中有不同的目錄規格時,所指定的優先順序:

  1. INCLUDE 或 EXCLUDE 子句中的 ALLCATALOGS 會覆寫 INCLUDE 或 EXCLUDE 子句中的所有 SOURCECATALOG 規格,並在參數檔的根目錄覆寫 OBJNAME 子句中完整物件名稱的容器規格。

  2. OBJNAME 子句中的明確目錄設定會覆寫 SOURCECATALOG 的所有執行處理 (但不覆寫 ALLCATALOGS)。

  3. INCLUDE 或 EXCLUDE 子句中的 SOURCECATALOG 會覆寫在 TABLE 或 MAP 敘述句的根目錄中指定的全域 SOURCECATALOG 參數。

  4. 如果 INCLUDE 或 EXCLUDE 子句未指定 SOURCECATALOG 或 ALLCATALOGS,則全域 SOURCECATALOG 參數會對 OBJNAME 子句中任何不合格的物件名稱生效。

  5. 如果沒有上述任何參數,則會考慮所有型錄。

STAYMETADATA

(適用於 Oracle)。防止 Extract 擷取描述資料或由 Replicat 套用描述資料。

Extract 在表格上第一次遇到 DML 時,會擷取該表格的描述資料。在該表格上遇到 DDL 時,舊的描述資料就會變成無效。該表格的下一個 DML 會與新的描述資料相符,讓目標表格結構永遠與來源的結構保持在最新狀態。

不過,如果您知道特定的 DDL 作業不會影響表格的中繼資料,可以使用 STAYMETADATA,讓目前的中繼資料不會被擷取或複製。這是一項效能改進,對於匯入和匯出等作業有益,其中通常會執行截斷和停用限制條件的 DDL。這些作業不會影響表格結構,因為它與後續資料複製的完整性相關,因此在這類情況下可以忽略這些作業。例如,ALTER TABLE ADD FOREIGN KEY 不會影響表格描述資料。

以下是選擇性套用此項目的範例:

DDL INCLUDE ALL INCLUDE STAYMETADATA OBJNAME xyz

此範例說明複製時會包含所有 DDL,但只有在物件 xyz 上運作的 DDL 才會受限於 STAYMETADATA。

STAYMETADATA 也可在 EXCLUDE 子句中使用相同的方式。

STAYMETADATA 在來源和目標上必須使用相同的方式,以確保中繼資料完整性。

使用 STAYMETADATA 時,會將訊息新增至報表檔案。DDL 報表是由 DDLOPTIONS 參數與 REPORT 選項控制。

您可以使用 @ddl_staymetadata 命令檔,將相同的功能全域套用至來源上發生的所有 DDL:

此選項應與 Oracle GoldenGate 技術支援人員的協助搭配使用,因為 DDL 可能不一定會影響物件描述資料。如果未正確使用,可能會危害複製環境的完整性。

範例

以下是一些不同使用案例的範例:

範例 1:使用 DDL AUTOSCHEMA

使用 DDL AUTOSCHEMA INCLUDE/EXCLUDE OPTYPE 子句也可以根據 DDL 類型啟用篩選 (類似於「範例 1」中顯示的篩選)。

例如,若要啟用 hr 綱要的 AUTOSCHEMA,但排除 finance 綱要,請使用下列命令檔:

 DDL AUTOSCHEMA &
 INCLUDE OBJNAME hr.* &
 EXCLUDE OBJNAME finance.*

 MAP hr.*, TARGET hr.*;
 MAP finance.*, TARGET finance.*;

範例 2:結合 DDL 參數選項

以下為如何結合 DDL 參數選項的範例。

DDL  &
INCLUDE UNMAPPED &
    OPTYPE alter &
    OBJTYPE 'table' &
    OBJNAME users.tab* &
INCLUDE MAPPED OBJNAME * &
EXCLUDE MAPPED OBJNAME temporary.tab

此陳述式中的合併篩選條件指定下列項目:

範例 3:包含事件動作

下列範例會為所有 DDL 記錄指定 REPORT 的事件動作。

DDL INCLUDE ALL EVENTACTIONS (REPORT)

範例 4:在 DDL 的子集上使用事件動作

下列範例顯示如何在 DDL 的子集上使用 EVENTACTIONS。將複製所有 DDL,但只有在明確命名的物件上執行的 DDL 符合觸發 REPORT 和 LOG 事件動作的條件。

DDL INCLUDE ALL &
    INCLUDE OBJNAME sales.t* EVENTACTIONS (REPORT) &
    INCLUDE OBJNAME fin.my_tab EVENTACTIONS (LOG INFO)

範例 5:指定在 <source> Oracle 容器資料庫的物件上發出之 DDL 的 <catalog> 名稱的不同方法

下列範例示範指定來源 Oracle 容器資料庫中物件所發出之 DDL 目錄名稱的不同方式。

SOURCECATALOG pdb1
DDL INCLUDE OBJNAME sch1.obj1 INCLUDE SOURCECATALOG pdb2 OBJNAME sch2.obj2
DDL INCLUDE ALLCATALOGS OBJNAME sch.obj
DDL INCLUDE ALLCATALOGS OBJNAME pdb.sch.obj

範例 6:顯示 ALLOWEMPTYOBJECT 和 ALLOWEMPTYOWNER 的結合使用

以下顯示 ALLOWEMPTYOBJECT 和 ALLOWEMPTYOWNER 的合併使用。

DDL INCLUDE pdb.*.* ALLOWEMPTYOWNER ALLOWEMPTYOBJECT