ADD TRANDATA

使用 ADD TRANDATA 可以允许 Oracle GoldenGate 从事务处理记录中获取所需的事务处理信息。

使用此命令之前,请使用 DBLOGIN 命令建立数据库连接,

ADD TRANDATA 适用于下面列出的数据库:

对于其他受支持的数据库,此功能可能已经存在,或者必须通过数据库接口进行配置。

请参见以下各表,了解在使用 ADD TRANDATA 时如何使用通配符表示不同的数据库:

数据库 通配符使用
Db2 LUW、Db2 z/OS 通配符只能与表名一起使用。不能与方案名称一起使用。
Oracle 通配符可以与方案名称和表名一起使用。不能与 PDB 名称一起使用。
PostgreSQL 和 SQL Server 通配符可以与方案名称和表名一起使用

Db2 for i

使用 ADD TRANDATA 可以启动数据日志记录。ADD TRANDATA 命令调用 STRJRNPF,并且是为表启动日志记录的推荐方法,因为它可以确保在 STRJRNPF 命令中设置所需的日志映像属性 Record Images (IMAGES): *BOTH。

Db2 LUW

使用 ADD TRANDATA 可以对指定的表启用 DATA CAPTURE CHANGES。默认情况下,ADD TRANDATA 向数据库发出以下命令:

ALTER TABLE name DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS;

您可以通过使用带有 EXCLUDELONG 选项的 ADD TRANDATA 来排除 LONGVAR 子句。

Db2 z/OS

使用 ADD TRANDATA 可以对指定的表启用 DATA CAPTURE CHANGES。默认情况下,ADD TRANDATA 向数据库发出以下命令:

ALTER TABLE name DATA CAPTURE CHANGES;

Oracle 数据库

适用于 Oracle AI Database 26ai 的 Oracle GoldenGate 26ai 及更高版本的支持复制 JSON 关系二元性视图和 JSON 集合表。ADD TRANDATA 命令为 JSON Relational Duality Views 和 JSON Collection Tables 启用补充日志记录。但是,ADD TRANDATA 不影响 JSON 二元性视图基表,不会为基表添加事务数据。有关详细信息,请参阅 Oracle GoldenGate Microservices 文档中的设置 JSON DV 和 JSON 收集表的复制的先决条件。

请注意,使用类似于以下命令的命令时,将仅应用于表,而不会应用于 JSON 关系二元性视图和 JSON 集合表:

ADD TRANDATA HR.*

要从 JSON 二元性视图和 JSON 集合表捕获,您需要为需要复制的每个 JSON 二元性视图和 JSON 集合表运行 ADD TRANDATA 命令。这可确保您知道为复制设置的 JSON 二元性视图和 JSON 集合表,以避免系统超载。

注:使用 ADD TRANDATA 为 JSON Duality Views 启用逻辑复制时,不支持通配符。但是,JSON 收集表与常规表一样支持通配符,因此,TABLE/MAP 语句也允许使用通配符。

从 21c 发行版开始,此命令还将在 Oracle 数据库中为表启用自动捕获。

默认情况下,Oracle 的 ADD TRANDATA 用于 Oracle 时,默认情况下对指定表的主键启用了无条件日志事件记录,对所有唯一键和外键启用了有条件的补充日志事件记录。有关 Oracle GoldenGate 如何处理 Oracle AI Database 补充日志记录的更多信息,请参见 Ensuring Row Uniqueness in Source and Target Tables 。

如有可能,请使用 ADD SCHEMATRANDATA 命令,而不使用 ADD TRANDATA 命令。ADD SCHEMATRANDATA 命令可确保刚为其执行 DDL 的对象发生 DML 时的复制连续性。您可以使用排除参数来从方案规范中排除对象。

要使用 Oracle GoldenGate DDL 复制功能,您必须使用 ADD SCHEMATRANDATA 命令记录所需的补充数据。

在使用 ADD SCHEMATRANDATA 时,您可以使用带有 COLS 选项的 ADD TRANDATA 记录任何非键列,如 TABLE 和 MAP 参数中的 FILTER 语句和 KEYCOLS 子句所需的非键列。

注:可以使用 `ADD

           TRANDATA` for Oracle when DDL support is enabled, but only if you can stop DML on all tables before DDL is performed on them or, if that is not possible, you can guarantee that no users or applications will issue DDL that adds new tables whose names satisfy an object specification in a `TABLE` or `MAP` statement. There must be no possibility that users or applications will issue DDL that changes the key definitions of any tables that are already in the Oracle GoldenGate configuration.
           {: .infoboxnote}

Oracle 建议在使用 Oracle GoldenGate 时,将源数据库置于强制日志记录模式,并在数据库级别启用最少补充日志记录。这样,在执行更新操作时,会将行链接信息(如果存在)添加到重做日志中

将 ADD TRANDATA 用于 Oracle AI Database 时,需要注意以下事项。

PostgreSQL

使用 ADD TRANDATA 命令时,表的 REPLICA IDENTITY 设置将会变更。REPLICA IDENTITY 设置用于控制对于 UPDATE 或 DELETE 操作时应记录到事务处理日志的表中列的图像。

SQL Server

使用 ADD TRANDATA 可以提供 Oracle GoldenGate 重构 SQL 操作所需的扩展日志记录信息。默认情况下,SQL Server 事务处理日志提供的信息不足。

通过启用 TRANDATA,Oracle GoldenGate 会为数据库启用 SQL Server 更改数据捕获功能,并为启用了 TRANDATA 的每个实例创建一个更改数据捕获表

语法

ADD TRANDATA container.owner.table]
[, FILEGROUP filegroup-name]
[, NOSCHEDULINGCOLS | ALLCOLS]
[, ALLOWNONVALIDATEKEYS]
[, PARTIALJSON]
[, PREPARECSN  {WAIT | LOCK | NOWAIT | NONE}]

[container.]owner.table

对 Db2 LUW、Db2 z/OS、Oracle、PostgreSQL 和 SQL Server 有效。

由两部分或三部分组成的名称规范。对于除 Oracle 多租户容器数据库以外的所有受支持的数据库,使用两部分名称 owner.table。

对于 Oracle 多租户容器数据库,使用由三个部分组成的名称 container.owner.table。您可以用通配符来表示任何组成部分。将 ADD TRANDATA 与通配符一起使用可以筛出符合系统对象名称匹配的名称。要将 ADD TRANDATA 用于不是系统对象但具有与通配符模式中的系统对象的名称匹配的对象,请向这些对象发出不使用通配符的 ADD TRANDATA。

如果从 cdb$root 运行该命令,请确保还在数据库端设置以下用户权限:

ALTER USER userID SET CONTAINER_DATA = ALL  CONTAINER = CURRENT;

schema.table [JOURNAL library/journal] | library/file [JOURNAL library/journal]

对 Db2 for i 有效。

指定表的 SQL 方案和名称,或者本机库和文件名。如果使用 DEFAULTJOURNAL 命令设置了默认日志,则可以省略 JOURNAL 选项,否则需要该命令。

FILEGROUP filegroup-name

对 SQL Server 有效。

(Optional) You can designate the filegroup in which the SQL Server Change Data Capture staging tables will be placed, by using the FILEGROUP option with an existing filegroup name.

ADD TRANDATA owner.table FILEGROUP cdctables

如果在启用 TRANDATA 时需要针对每个表使用相同的 FILEGROUP,也可以在 GLOBALS 文件中使用 FILEGROUP 选项。

以下示例显示如何在 GLOBALS 文件中设置 FILEGROUP myFileGroup:

FILEGROUP myFileGroup

输出为:

Logging of supplemental log data is enabled for table dbo.test1 in filegroup
myFileGroup

在这种情况下,ADD TRANDATA 命令对所有表使用 myFileGroup。

如果您同时将 FILEGROUP 参数用于 ADD TRANDATA,则该命令会覆盖 GLOBALS 文件中定义的文件组名称。

例如,如果先在 GLOBALS 文件中设置 FILEGROUP myFileGroup,然后执行下面的 ADD TRANDATA 命令:

ADD TRANDATA dbo.* FILEGROUP yourFileGroup

输出则为:

Logging of supplemental log data is enabled for table dbo.test1 in filegroup
yourFileGroup

在这种情况下,ADD TRANDATA 对所有表都使用 yourFileGroup 而非 myFileGroup。

If you don’t specify the FILEGROUP either in GLOBALS or with ADD TRANDATA, then the command line considers the default FILEGROUP of the database while adding TRANDATA of the table. 例如,如果您运行 ADD TRANDATA dbo.*,则输出为:

Logging of supplemental log data is enabled for table dbo.test1 in filegroup
PRIMARY

在这种情况下,默认的 FILEGROUP 为 Primary。如果您运行 INFO TRANDATA 命令,则 FILEGROUP 名称显示为 PRIMARY。

NOSCHEDULINGCOLS | ALLCOLS

对 Oracle 和 PostgreSQL 有效。

从 Oracle GoldenGate 21c 开始,如果正在运行的数据库支持自动捕获功能,则 Oracle 数据库 21c 及更高版本将弃用 NOSCHEDULINGCOLS。

这些选项可满足集成复制的日志记录需求,集成复制将处理您使用 ADD TRANDATA 指定的表。

NOSCHEDULINGCOLS

仅对 Oracle 有效。

禁用调度列的日志记录。默认情况下,ADD TRANDATA 对指定表的主键启用了无条件日志记录,对所有唯一键和外键启用了有条件的补充日志日志记录。无条件日志记录强制将主键值写入日志,无论该键在当前操作中是否已更改。如果在当前操作中至少更改了外键或唯一键之一,则条件日志记录将记录外键或唯一键的所有列值。主键、唯一键和外键必须对入站服务器都可用,才能计算相关项。

ALLCOLS

对表的所有键和非键列启用无条件的补充日志记录。此选项允许对以下对象启用日志记录:计算相关项所需的键,以及用于筛选、冲突解决或其他用途的所有其他列。


对于 PostgreSQL,ALLCOLS 将表的 REPLICA IDENTITY 设置为 FULL。在 ADD TRANDATA 命令中指定 ALLCOLS,以便执行 UPDATE 和 DELETE 操作后对所有列进行日志记录,即使未修改这些列也是。

对于没有主键或唯一索引的表,ALLCOLS 选项是多余的。语法如下:

ADD TRANDATA table_name ALLCOLS

COLS (columns)

对 Oracle 有效。

使用 COLS 选项可以记录特定的非键列。该值可用于记录在 KEYCOLS 子句中指定的列,以及记录筛选或操纵所需的列,这可能比在 TABLE 语句中使用 FETCHCOLS 子句提取这些值更高效。使用逗号分隔多列,例如 NAME,ID,DOB。

INCLUDELONG | EXCLUDELONG

对 Db2 LUW 有效。

控制 ADD TRANDATA 发出的 ALTER TABLE 是否包括 INCLUDE LONGVAR COLUMNS 属性。INCLUDELONG 是默认值。当使用此选项发出 ADD TRANDATA 时,Oracle GoldenGate 发出以下语句:

ALTER TABLE name DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS;

当使用 EXCLUDELONG 时,发出以下命令:

ALTER TABLE name DATA CAPTURE CHANGES;

当使用 EXCLUDELONG 时,Oracle GoldenGate 不支持在包括 LONGVAR 列的表的映像之前像的功能。例如,GETUPDATEBEFORES 参数。要支持此功能,事务处理日志中对 LONGVAR 列的更改必须包括列值的前像和后像。

NOKEY

对 Db2 for i、Db2 LUW、Db2 z/OS、Oracle 有效。

从 Oracle GoldenGate 21c 开始,如果正在运行的数据库支持自动捕获功能,则 Oracle Database 21c 及更高版本将弃用 NOKEY。

此选项用于禁止对主键列进行补充日志记录。如果使用 NOKEY,则使用 COLS 选项可以对能充当关键字的备用列进行日志记录,并可以使用 TABLE 或 MAP 参数的 KEYCOLS 选项将这些列指定为替代键。

NOVALIDATE

对 Db2 for i、Db2 LUW、Db2 z/OS、Oracle 有效。

禁止显示有关 ADD TRANDATA 正在处理的表的其他信息。默认情况下,此选项是启用的。其他信息处理会产生命令响应用时,因此,可以使用此选项增加响应时间。

ALLOWNONVALIDATEDKEYS

对 Db2 for i、Db2 LUW、Db2 z/OS、Oracle 有效。

它在补充日志记录中包含 NON VALIDATED 和 NOT VALID 主键。这些键将覆盖 Oracle GoldenGate 使用的常规键选择标准。如果使用 GLOBALS 参数 ALLOWNONVALIDATEDKEYS,则无论是否指定,ADD SCHEMATRANDATA 都将与 ALLOWNONVALIDATEDKEYS 一起运行。默认情况下,不会记录 NON VALIDATED 和 NOT VALID 主键。

PARTIALJSON

对 Oracle 有效。

在表级别提取部分 JSON 更新。如果启用,重做将包含部分 JSON 记录。

另请参见 TRANLOGOPTIONS FETCHPARTIALJSON 参数。

PREPARECSN {WAIT | LOCK | NOWAIT | NONE}

对 Oracle 的 DML 和 DDL 都有效。自动在源中准备表,以便 Oracle 数据泵导出转储文件将包含实例化 CSN。复制使用 Oracle 数据泵(在导入时)设置的按表实例化 CSN 以筛选出线索记录。在目标中,数据泵导入通过 DBOPTIONS ENABLE_INSTANTIATION_FILTERING 参数启用表级别实例化筛选,使用实例化 SCN 填充系统表和视图。

WAIT

等待任何正在运行的事务处理并准备表实例化。

LOCK

锁定表(以准备表实例化)。

NOWAIT

默认行为,实例化准备立即完成。

NONE

未进行实例化准备。

示例


以下示例会导致以下情况之一:对 Oracle 表的主键进行日志记录;对 SQL Server 或 DB2 表的补充数据进行日志记录。这还将为表启用自动捕获。

ADD TRANDATA hr.employees

以下示例对名为 acct 的表的所有键和非键列启用无条件的补充日志记录。这还将为表启用自动捕获。

ADD TRANDATA hr.employees ALLCOLS

以下 Oracle AI Database 示例将记录主键以及非键列名称和地址。这还将为表启用自动捕获。

ADD TRANDATA hr.employees, COLS (name, address)

以下 Oracle AI Database 示例可防止记录主键,但会记录非键列 name 和 pid 。这还将为表启用自动捕获。

ADD TRANDATA hr.employees, NOKEY, COLS (name, pid)

以下示例会添加日志记录,但不为表实例化做准备。这还将为表启用自动捕获。

ADD TRANDATA hr.employees PREPARECSN NONE

以下示例禁止显示其他表信息处理。这还将为表启用自动捕获。

ADD TRANDATA hr.employees.*name NOVALIDATE