准备要处理的表
您必须执行以下任务来准备要在 Db2 z/OS 的 Oracle GoldenGate 环境中使用的表。
禁用触发器和级联约束条件
对目标表禁用触发器、级联删除约束条件和级联更新约束条件,或者更改它们以忽略 Oracle GoldenGate 数据库用户所做的更改。Oracle GoldenGate 将复制由触发器或级联约束条件产生的 DML。如果在目标表上激活了相同的触发器或约束条件,则由于复制的版本,该触发器或约束条件将变得冗余,并且数据库将返回错误。请考虑以下示例,其中源表为 emp_src 和 salary_src,目标表为 emp_targ 和 salary_targ。
-
将为
emp_src发出删除。 -
它将删除级联到
salary_src。 -
Oracle GoldenGate 会将两项删除操作发送到目标。
-
父删除首先到达,并应用于
emp_targ。 -
父删除将删除级联到
salary_targ。 -
salary_src中的级联删除将应用于salary_targ。 -
该行在步骤 5 中被删除,无法找到。
确保表的行唯一性
Oracle GoldenGate 需要源表和目标表上的唯一行标识符来查找用于复制更新和删除的正确目标行。
除非 TABLE 或 MAP 语句中存在 KEYCOLS 子句,否则 Oracle GoldenGate 将按以下优先级顺序选择要使用的行标识符:
-
主键
-
按字母数字顺序排列的第一个不包含时间戳或非实体化计算列的唯一键。
-
如果上述关键字类型均不存在(即使表中可能定义了其他类型的关键字),则 Oracle GoldenGate 将构造所有列的伪关键字数据库允许在唯一密钥中使用,不包括 Oracle GoldenGate 在密钥中不受支持的密钥或从 Oracle GoldenGate 配置中排除的密钥。
注:如果表中存在其他不可使用的关键字,或者表中没有关键字,则 Oracle GoldenGate 会将相应的消息记录到报表文件中。从所有列构建密钥会妨碍 Oracle GoldenGate 在源系统上的性能。在目标上,此键会导致复制使用更广泛、效率较低的 WHERE 子句。
- 如果表没有相应的键,或者您希望未使用现有键,则可以定义替代键(如果表具有始终包含唯一值的列)。通过在 Extract
TABLE和 ReplicatMAP参数中包含KEYCOLS子句,可以定义此替代关键字。指定的键将覆盖 Oracle GoldenGate 找到的任何现有主键或唯一键。请参阅 Reference for Oracle GoldenGate 中的 TABLE | MAP 。
使用 KEYCOLS 指定定制密钥
如果表没有上述行标识符类型之一,或者您希望不使用这些标识符,则可以定义替代键(如果表具有始终包含唯一值的列)。通过在 Extract TABLE 和 Replicat MAP 参数中包含 KEYCOLS 子句,可以定义此替代关键字。指定的键将覆盖 Oracle GoldenGate 找到的任何现有主键或唯一键。有关详细信息,请参阅 Oracle GoldenGate 参考。
使用 ROWID 列处理表
任何插入到包含数据类型为 ROWID GENERATED ALWAYS 的列(默认值)的目标表中的尝试都将失败,并显示以下 ODBC 错误:
ODBC error: SQLSTATE 428C9 native database error -798. {DB2 FOR OS/390}{ODBC DRIVER}{DSN08015} DSNT408I SQLCODE = -798, ERROR: YOU CANNOT INSERT A VALUE INTO A COLUMN THAT IS DEFINED WITH THE OPTION GENERATED ALWAYS. COLUMN NAME ROWIDCOL.
您可以执行以下操作之一来准备包含 Oracle GoldenGate 要处理的 ROWID 列的表:
-
确保将目标表中的任何
ROWID列定义为GENERATED BY DEFAULT。 -
如果无法更改表定义,可以使用以下过程解决此问题。
要解决方法 ROWID GENERATE ALWAYS:
-
对于源表,创建 Extract
TABLE语句,并在该语句中使用COLSEXCEPT子句以排除ROWID列。例如:TABLE tab1, COLSEXCEPT (rowidcol);COLSEXCEPT子句将不捕获ROWID列并将其复制到目标表。 -
对于目标表,请确保 Replicat 不尝试使用
ROWID列作为关键字。可通过以下方式之一执行此操作:-
在目标表定义中指定主键。
-
如果无法创建键,请为表创建一个 Replicat
MAP参数,并在该语句中使用KEYCOLS子句,该子句包含除ROWID列以外的任何唯一列。复制将使用这些列作为键。例如:MAP tab1, TARGET tab1, KEYCOLS (num, ckey);
-
维护实体化查询表
要维护源实体化查询表与目标实体化查询表 (MQT) 之间的奇偶校验,请复制基表,但不复制 MQT。目标数据库根据 Replicat 应用到基表的更改维护 MQT。
下面是配置这些表的规则:
-
在
TABLE和MAP语句中包含基表。 -
请勿在
TABLE和MAP语句中包含 MQT。 -
通配符可以在
TABLE和MAP语句中使用,即使它们可以解析 MQT 名称和常规表名。Oracle GoldenGate 会自动从通配符表列表中排除 MQT。但是,在 ExtractTABLE语句中按名称显式列出的任何 MQT 将导致 Extract 异常终止。