准备要处理的表
必须在 Oracle GoldenGate 环境中解决以下部分中的表属性。
目标标识列、触发器和约束的复制考虑
将数据复制到具有身份列、触发器以及级联和检查约束条件的目标 SQL Server 数据库时,请考虑以下事项:
-
对于具有标识列的列,Replicat 会为表设置
IDENTITY_INSERT ON,这可能会降低传送性能。 -
对于具有触发器或级联约束的表,如果将 Replicat 配置为提供触发器将插入或级联约束将更新或删除的相同数据,则执行触发器或级联操作可能会导致复制错误。
例如,源上的
TableA具有将记录插入到TableB中的触发器。提取配置为捕获TableA和TableB的记录。在目标上,复制将首先插入TableA的记录,然后触发TableA的触发器并将其插入到TableB中,然后复制尝试将同一记录插入到TableB中,这将导致复制错误。 -
检查是否还强制实施了任何外键约束条件,这可能会降低交付性能。
-
对于目标数据库上具有触发器的表,请将
SET XACT_ABORT参数设置为 off。这可确保触发器操作的执行不会导致缺少事务处理。
要克服这些情况,可以根据复制用例实施多个选项。
-
对于复制是向目标表写入数据的唯一进程的单向实施,请考虑针对目标表的“身份”列、触发器和约束的以下选项。
-
禁用或删除目标表的 Identity 属性、触发器和约束条件。
-
修改身份属性、触发器和约束,并为每个属性设置
NOT FOR REPLICATION选项,并确保 Microsoft ODBC 驱动程序至少为版本 17.8.1。
-
-
对于同时将复制数据和应用程序向目标表写入数据并启用触发器和约束的多向实施,请修改 Identity 属性、触发器和约束,并为每个表设置
NOT FOR REPLICATION选项,并确保 Microsoft ODBC 驱动程序至少为版本 17.8.1。此外,要在多向复制配置中使用
IDENTITY列,请将IDENTITY列定义为增量值等于配置中的服务器数,每个列具有不同的种子值。例如,三数据库配置如下所示:
Database1 将种子值设置为 0,以 3 为增量。
Database2 将种子值设置为 1,并以 3 为增量。
Database3 将种子值设置为 2,以 3 为增量。
使用数组处理改进 IDENTITY 复制
由于每个会话只有一个表可以将 IDENTITY_INSERT 设置为 ON,因此在将 IDENTITY 数据应用于会话中的多个表时,复制必须持续切换 IDENTITY_INSERT。要在此情况下提高复制的性能,请使用 BATCHSQL 参数。BATCHSQL 使 Replicat 使用数组处理,而不是一次应用一个 SQL 语句。
确保源表和目标表中的行唯一性
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 找到的任何现有主密钥或唯一密钥。