DDL

有效对象

提取和复制

注:只有 Oracle 到 Oracle 数据库之间以及 MySQL 到 MySQL 数据库之间支持 DDL 复制。

说明

使用 DDL 参数可以:

在不带选项的情况下使用时,DDL 参数不执行过滤,并导致按如下方式传播所有 DDL 操作:

与选项一起使用时,DDL 参数用作过滤代理,以根据以下内容包括或排除 DDL 操作:

一个参数文件中只能使用一个 DDL 参数,但您可以组合多个包含和排除选项以将 DDL 过滤到所需的级别。

注:请勿将 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 标识包含或排除条款的开头。

包含或排除子句必须包含 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 的准则:

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 应用于对象的全限定名称。要正确指定两部分和三部分对象名称和通配符,请参见 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 规范之前或之后。

以下是当参数文件中存在不同的目录规范时指定的优先级顺序:

  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 首次遇到表 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:

此选项应在 Oracle GoldenGate 技术支持人员的协助下使用,因为可能并不总是很明显 DDL 会影响对象元数据。如果使用不当,可能会破坏复制环境的完整性。

示例

以下是几个不同用例的示例:

示例 1:使用 DDL AUTOSCHEMA

过滤(类似于示例 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.*;

示例 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:为 DDL 指定对 <source> Oracle 容器数据库中的对象发出的 <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