DDL
有效对象
提取和复制
注:只有 Oracle 到 Oracle 数据库之间以及 MySQL 到 MySQL 数据库之间支持 DDL 复制。
说明
使用 DDL 参数可以:
-
启用
DDL支持 -
筛选
DDL操作 -
配置基于
DDL记录的处理操作
在不带选项的情况下使用时,DDL 参数不执行过滤,并导致按如下方式传播所有 DDL 操作:
-
作为提取参数,它捕获在所有支持的数据库对象上生成的所有受支持的
DDL操作,并将其发送到线索。 -
作为 Replicat 参数,它将复制 Oracle GoldenGate 线索中的所有
DDL操作并将其应用于目标。这与不带此参数的默认行为相同。
与选项一起使用时,DDL 参数用作过滤代理,以根据以下内容包括或排除 DDL 操作:
-
范围
-
对象类型
-
工序类型
-
对象的名称
-
DDL命令语法和/或注释中的字符串
一个参数文件中只能使用一个 DDL 参数,但您可以组合多个包含和排除选项以将 DDL 过滤到所需的级别。
-
DDL参数的筛选选项对从事务处理来源获取的主要提取有效,但对数据泵提取无效。 -
组合后,多个过滤器选项规范将以
AND语句的形式逻辑链接。 -
必须满足使用多个选项指定的所有过滤条件,才能复制
DDL语句。 -
在
DDL参数语句中使用复杂过滤条件时,建议先在测试环境中测试配置,然后再将其用于生产环境。 -
有关更多信息,请参见 Example 1,"Example" 。
注:请勿将 DDL 参数用于提取数据泵。这些进程类型不允许映射或转换 DDL,并且将在直通模式下自动传播 DDL 记录。对源表(例如 ALTER TABLE TableA...)执行的 DDL 将由具有相同表名的 Replicat (ALTER TABLE TableA) 应用。不能将其映射为 ALTER TABLE TableB。
有关如何使用 Oracle GoldenGate DDL 支持的其他信息,请参见 Oracle:DDL Replication 和 MySQL:DDL Replication in Oracle GoldenGate Microservices Documentation 。
语法
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 到 Oracle 的复制、Oracle 到 MySQL 的复制以及 MySQL 到 MySQL 的数据复制中有效。
DDL AUTOSCHEMA 参数选项用于启用自动模式演化功能。默认情况下禁用此选项。
语法
DDL AUTOSCHEMA
只有 MAPPED DDL 操作与自动方案演化相关。因此,在包含/排除条件中作为 OBJNAME 子句的一部分指定的对象名称应该与目标表名称(而不是源表名称)相对应。
在 Replicat 参数文件中将 OBJNAME 与 MAPPED 一起使用时,OBJNAME 的值必须引用使用 MAP 语句的 TARGET 子句指定的名称。
有关详细信息,请参见 Using Automatic Schema Evolution
INCLUDE | EXCLUDE
DDL 筛选选项
以下语法选项允许对 Oracle GoldenGate 复制的 DDL 进行筛选和操作。这些选项适用于 DDL 参数的 INCLUDE 和 EXCLUDE 子句以及支持 DDL 复制的其他参数。
使用 INCLUDE 或 EXCLUDE 标识包含或排除条款的开头。
-
包含子句包含用于标识此参数将影响的
DDL的过滤条件。 -
排除子句包含从此参数中排除特定
DDL的过滤条件。
包含或排除子句必须包含 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 参数中包括任何 Oracle GoldenGate 安装的 DDL 对象。确保这些参数中的通配符规范不包括 Oracle GoldenGate 安装的 DDL 对象。这些对象不能是 Oracle GoldenGate 配置的一部分,但提取进程必须了解对这些对象的操作,这就是为什么不能使用 EXCLUDE、TABLEEXCLUDE 或 MAPEXCLUDE 参数语句将它们显式排除在配置中的原因。
ALLOWEMPTYOBJECT
使用 ALLOWEMPTYOBJECT 可以允许 OBJNAME 规范处理不包含对象名称的 DDL。例如:
DDL INCLUDE OBJNAME sch.* ALLOWEMPTYOBJECT
ALLOWEMPTYOWNER
使用 ALLOWEMPTYOWNER 可以允许 OBJNAME 规范处理不包含所有者名称的 DDL。例如:
DDL INCLUDE OBJNAME pdb.sch.* ALLOWEMPTYOWNER
EVENTACTIONS (action)
导致提取或复制流程根据事务处理日志或线索中的 DDL 记录(称为事件记录)执行定义的操作。如果 DDL 记录符合通过 Extract 或数据泵写入线索的条件,或者符合 Replicat 执行的条件(由 DDL 参数的其他过滤选项确定),则触发 DDL 事件。可以使用此系统基于数据库事件定制处理。
对于 <action>,请参见 MAP 和 TABLE 参数下的 EVENTACTIONS。
对 DDL 记录使用 EVENTACTIONS 的准则:
-
CHECKPOINTBEFORE:由于每个DDL记录都是自治的,因此保证DDL记录是事务处理的开始;因此,对DDL记录隐含CHECKPOINT BEFORE事件操作。 -
IGNORE:此选项对DDL记录无效。由于DDL操作是自治的,因此忽略记录等同于忽略整个事务处理。
EVENTACTIONS 不支持以下 DDL 对象,因为它们是派生对象:
-
索引
-
触发
-
同义语
-
RENAME(在表中)和ALTER TABLE RENAME
MAPPED | UNMAPPED | OTHER | ALL
使用 MAPPED、UNMAPPED、OTHER 和 ALL 基于 DDL 操作范围应用 INCLUDE 或 EXCLUDE。
-
MAPPED将INCLUDE或EXCLUDE应用于MAPPED范围的DDL操作。MAPPED过滤是在使用其他DDL参数选项指定的过滤之前执行的。 -
UNMAPPED将INCLUDE或EXCLUDE应用到UNMAPPED范围的DDL操作。 -
OTHER将INCLUDE或EXCLUDE应用于OTHER范围的DDL操作。 -
ALL将INCLUDE或EXCLUDE应用于所有范围的DDL操作。
DDL EXCLUDE ALL 是一个特殊处理选项,用于维护 Oracle GoldenGate 的最新对象元数据,同时阻止复制 DDL 操作本身。使用 Oracle GoldenGate 以外的方法将 DDL 应用于目标时,可以使用 DDL EXCLUDE ALL,但您希望 Oracle GoldenGate 将数据更改复制到目标对象。它在对象发生更改时将当前元数据提供给 Oracle GoldenGate,从而无需停止和启动 Oracle GoldenGate 进程。以下特殊条件适用于 DDL EXCLUDE ALL:
-
DDL EXCLUDE ALL不要求使用INCLUDE子句。 -
使用
DDL EXCLUDE ALL时,可以将WILDCARDRESOLVE参数设置为IMMEDIATE,以便在需要时允许立即解析DML。
OBJNAME name
使用 OBJNAME 将 INCLUDE 或 EXCLUDE 应用于对象的全限定名称。要正确指定两部分和三部分对象名称和通配符,请参见 Using Wildcards in Command Arguments 。
将区分大小写的对象名称括在双引号内。
不区分大小写的示例:
DDL INCLUDE OBJNAME accounts.*
区分大小写的示例:
DDL INCLUDE OBJNAME accounts."cust"
不要将 OBJNAME 用于 Oracle USER 对象,因为 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>,在单引号内按任意顺序提供单词。要包括空格,请将空格(和单词,如果适用)放在双引号中。还可以使用双引号将句子括起来。
要使 INSTRWORDS 生效,DDL 中必须存在所有指定的单词。
示例:
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 子句中指定的所有对象名称指定默认容器。要生效,必须在 OBJNAME 规范之前指定 SOURCECATALOG。有关更多信息,请参见 "SOURCECATALOG ",包括使用包含两部分名称的语句,其中需要包含三部分对象名称才能完全标识对象。
ALLCATALOGS 指定在解析在同一 INCLUDE 或 EXCLUDE 子句中指定的对象名称时,应考虑数据库的所有容器。ALLCATALOGS 可以放置在 OBJNAME 规范之前或之后。
以下是当参数文件中存在不同的目录规范时指定的优先级顺序:
-
INCLUDE或EXCLUDE子句中的ALLCATALOGS覆盖INCLUDE或EXCLUDE子句和参数文件根目录中的所有SOURCECATALOG规范,并覆盖OBJNAME子句中全限定对象名称的容器规范。 -
OBJNAME子句中的显式目录规范将覆盖SOURCECATALOG的所有实例(但不会覆盖ALLCATALOGS)。 -
INCLUDE或EXCLUDE子句中的SOURCECATALOG覆盖在TABLE或MAP语句的根处指定的全局SOURCECATALOG参数。 -
如果
INCLUDE或EXCLUDE子句未指定SOURCECATALOG或ALLCATALOGS,则全局SOURCECATALOG参数对OBJNAME子句中的任何不合格的对象名称生效。 -
在没有上述任何参数的情况下,将考虑所有目录。
STAYMETADATA
(对 Oracle 有效)。阻止提取或复制应用元数据。
当 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 报告由带有 REPORT 选项的 DDLOPTIONS 参数控制。
通过使用 @ddl_staymetadata 脚本,此相同功能可以全局应用于源上发生的所有 DDL:
-
@ddl_staymetadata_on全局关闭元数据版本控制。 -
@ddl_staymetadata_off全局重新启用元数据版本控制。
此选项应在 Oracle GoldenGate 技术支持人员的协助下使用,因为可能并不总是很明显 DDL 会影响对象元数据。如果使用不当,可能会破坏复制环境的完整性。
示例
以下是几个不同用例的示例:
示例 1:使用 DDL AUTOSCHEMA
-
示例 A:
要对源方案
atssrc和目标方案atstgt中的所有表启用AUTOSCHEMA,请执行以下操作:DDL AUTOSCHEMA INCLUDE ALL MAP atssrc.*, TARGET atstgt.*; -
示例 B:
过滤(类似于示例 1 中所示的过滤),也可以使用 DDL AUTOSCHEMA INCLUDE/EXCLUDE OPTYPE 子句基于 DDL 类型启用。
例如,要为 hr 方案启用 AUTOSCHEMA,但不包括 finance 方案,请使用以下脚本:
DDL AUTOSCHEMA &
INCLUDE OBJNAME hr.* &
EXCLUDE OBJNAME finance.*
MAP hr.*, TARGET hr.*;
MAP finance.*, TARGET finance.*;
-
示例 C:
要为所有表启用
AUTOSCHEMA并使用定制TYPEMAP在目标表上为适用于所有表的所有源int类型列使用bigint。DDL AUTOSCHEMA INCLUDE ALL AUTOSCHEMAOPTIONS TYPEMAP 'int'= 'bigint' MAP atssrc.*, TARGET atstgt.tgt_* -
示例 D:
要为所有表启用
AUTOSCHEMA并使用定制TYPEMAP在目标表上为适用于所有表的所有源int类型列使用bigint,但要将smallint用作财务方案下所有表的源int类型的目标列类型。DDL AUTOSCHEMA INCLUDE ALL AUTOSCHEMAOPTIONS TYPEMAP 'int'= 'bigint' MAP hr.*, TARGET hr.*; MAP finance.*, TARGET finance.*, AUTOSCHEMAOPTIONS (TYPEMAP 'smallint'='bigint');<–>
示例 2:组合 DDL 参数选项
下面是一个如何组合 DDL 参数选项的示例。
DDL &
INCLUDE UNMAPPED &
OPTYPE alter &
OBJTYPE 'table' &
OBJNAME users.tab* &
INCLUDE MAPPED OBJNAME * &
EXCLUDE MAPPED OBJNAME temporary.tab
此语句中的组合过滤条件指定以下内容:
-
INCLUDE未使用TABLE或MAP语句(UNMAPPED范围)映射表的所有ALTER TABLE语句,但仅当这些表归users所有且其名称以tab开头时, -
INCLUDETABLE或MAP语句(MAPPED范围)映射的所有表的所有DDL操作类型, -
EXCLUDE范围内为MAPPED的所有表的所有DDL操作类型,但前提是这些表归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:为 DDL 指定对 <source> Oracle 容器数据库中的对象发出的 <catalog> 名称的不同方式
以下示例演示了指定对源 Oracle 容器数据库中的对象发出的 DDL 目录名的不同方法。
- 以下内容包括用于
DDL处理的pdb1.sch1.obj1和pdb2.sch2.obj2。
SOURCECATALOG pdb1
DDL INCLUDE OBJNAME sch1.obj1 INCLUDE SOURCECATALOG pdb2 OBJNAME sch2.obj2
- 以下内容包括用于
DDL处理的任何目录中名称为sch.obj的所有对象。
DDL INCLUDE ALLCATALOGS OBJNAME sch.obj
- 以下内容包括用于
DDL处理的任何目录中名为sch.obj的所有对象,因为ALLCATALOGS覆盖任何其他目录规范。
DDL INCLUDE ALLCATALOGS OBJNAME pdb.sch.obj
示例 6:显示 ALLOWEMPTYOBJECT 和 ALLOWEMPTYOWNER 的组合使用
下面显示了 ALLOWEMPTYOBJECT 和 ALLOWEMPTYOWNER 的组合使用。
DDL INCLUDE pdb.*.* ALLOWEMPTYOWNER ALLOWEMPTYOBJECT