准备要处理的表

必须在 Oracle GoldenGate 环境中解决以下表属性。

禁用触发器和级联约束条件

对目标 Sybase 表禁用触发器、级联删除约束条件和级联更新约束条件,或者更改它们以忽略 Oracle GoldenGate 数据库用户所做的更改。Oracle GoldenGate 将复制由触发器或级联约束条件产生的 DML。如果在目标表上激活了相同的触发器或约束条件,则由于复制的版本,该触发器或约束条件将变得冗余,并且数据库将返回错误。请考虑以下示例,其中源表为 emp_src 和 salary_src,目标表为 emp_targ 和 salary_targ。

  1. 对 emp_src 发出删除。

  2. 它将删除级联到 salary_src。

  3. Oracle GoldenGate 会将两项删除操作发送到目标。

  4. 父删除首先到达,并应用于 emp_targ。

  5. 父删除将删除级联到 salary_targ。

  6. salary_src 中的级联删除将应用于 salary_targ 。

  7. 无法找到该行,因为已在步骤 5 中将其删除。

要将 Replicat 配置为在数据库会话开始时禁用目标触发器,请执行以下步骤:

  1. 为复制用户分配复制角色。

  2. 将以下参数语句添加到 Replicat 参数文件的根级别。

SQLEXEC "set triggers off"

分配行标识符

Oracle GoldenGate 在源表和目标表上需要某种形式的唯一行标识符,以查找用于复制更新和删除的正确目标行。

限制没有关键字的表中的行更改

如果目标表没有主键或唯一键,则可能存在重复的行。Oracle GoldenGate 可能会更新或删除目标表中的太多行,从而导致源和目标数据不同步,而不会发出错误消息来向您发出预警。要限制更新的行数,请在 Replicat 参数文件中使用带有 LIMITROWS 选项的 DBOPTIONS 参数。LIMITROWS 可以提高 Oracle GoldenGate 在目标系统上的性能,因为仅处理一行。

复制加密数据

Oracle GoldenGate 支持使用系统加密密码加密的列,但不支持使用用户定义的密码加密的列。根据以下 Oracle GoldenGate 限制,检查要从中捕获数据的表:

加密的列在数据文件和日志中进行了加密,因此必须将 Extract 配置为从数据库提取明文值。要触发此提取,请使用 Extract TABLE 参数的 FETCHCOLS 和 FETCHMODCOLS[EXCEPT] 选项。FETCHCOLS 强制提取不在日志中的值,而 FETCHMODCOLS 或 FETCHMODCOLS[EXCEPT] 强制提取日志中的值。这些参数一起使用可确保始终从数据库中提取加密的列。

以下示例说明了如何配置 Extract 以支持加密。在此示例中,加密列为 cardnum。

TABLE ab.payments, FETCHCOLS (cardnum), FETCHMODCOLS (cardnum);

准备事务处理日志

要捕获 DML 操作,Oracle GoldenGate 将读取联机日志。为了确保 Oracle GoldenGate 处理的连续性和完整性,必须按照以下各节中的说明配置日志:

初始化辅助截断点

在运行 Oracle GoldenGate 提取处理之前,在源系统上建立辅助日志截断点。提取使用辅助截断点来标识仍待处理的数据。

要初始化辅助截断点,请以具有 sa_role 权限的用户身份登录到数据库,然后发出以下命令:

dbcc settrunc( 'ltm', valid )

默认情况下,提取将在建立辅助截断点后对其进行管理。不允许在必要的时间停止提取;否则日志最终可能会填充,数据库将停止。解决此问题的唯一方法是禁用辅助截断点并在 Oracle GoldenGate 外部对其进行管理,然后清除事务处理日志。提取尚未处理的数据将丢失,您必须重新同步源和目标数据。

要控制辅助截断点的管理方式,请使用 TRANLOGOPTIONS 参数。有关详细信息,请参阅《 Reference for Oracle GoldenGate for Windows and UNIX 》。

调整日志大小并保留日志

在源系统上保留足够的日志数据,以便您可以在停止提取或存在计划外停机后从其检查点重新开始提取。提取必须有权访问包含最早未提交工作单元的开始时间的日志,以及此后的所有日志。要确定提取检查点的位置,请使用 INFO EXTRACT 命令。有关 INFO EXTRACT 的更多信息,请参见 Reference for Oracle GoldenGate for Windows and UNIX 。

如果在联机或备份日志中未保留提取处理期间需要的数据,则可能需要采取以下纠正措施之一:

确保不要使用导致旧归档文件被源系统上的新备份覆盖的备份或归档选项。新备份应是与旧备份名称不同的单独文件。这可确保如果提取查找特定日志,该日志仍将存在,并且还可确保数据在支持案例需要时可用。

启用事务日志记录

使用 ADD TRANDATA 命令标记每个源表以进行复制。此命令使用 Sybase sp_setreptable 和 sp_setrepcol 系统过程。建议使用 ADD TRANDATA 来标记表,而不是通过数据库界面使用这些过程,但所有者或系统管理员可以根据需要使用它们。有关更多信息,请参见 Sybase 文档。

要使用 ADD TRANDATA 标记要复制的表,请执行以下操作:

对要标记的每个表运行 ADD TRANDATA 命令。ADD TRANDATA 命令的语法为:

ADD TRANDATA SCHEMA.TABLE LOBSNEVER | LOBSALWAYS | LOBSALWAYSNOINDEX | LOBSIFCHANGED

LOBSNEVER | LOBSALWAYS | LOBSALWAYSNOINDEX | LOBSIFCHANGED 控制 LOB 数据是从不传播的,仅在更改时传播(默认值),还是始终传播。如果未指定 LOB 选项,则 LOBSIFCHANGED 是默认值。ADD TRANDATA 命令将覆盖当前为表设置的 LOB 复制设置。

注:某些 ADD TRANDATA 选项启用 sp_setrepcol 的 ALWAYS_REPLICATE 选项。如果 LOB 列包含 NULL 值,然后表中的另一列将更新(但不更新 LOB),则即使启用了 ALWAYS_REPLICATE,也不会捕获 LOB。