最近在ORACLE 到MYSQL的使用OGG进行数据迁移中遇到了数据在双向同步数据死循环的问题,在正常对oracle的同步上,我们使用以下参数来防止抽取进程对复制进程提交的事务进行抽取:
TRANLOGOPTIONS EXCLUDEUSER OGG GETAPPLOPS IGNOREREPLICATES
实际上 tranlogoptions excludeuser OGG 的作用是在抽取日志时排除掉OGG用户, GETAPPLOPS 指抓取应用的事务, IGNOREREPLICATES是忽略掉复制进程的事务。
GETAPPLOPS | IGNOREAPPLOPS: Controls whether or not data operations (DML) produced by business applications except Replicat are included in the content that Extract writes to a specific trail or file. GETREPLICATES | IGNOREREPLICATES: Controls whether or not DML operations produced by Replicat are included in the content that Extract writes to a specific trail or file.
但到了MYSQL 端进行抽取发现抽取进程不支持tranlogoptions excludeuser参数,此时即使加了 IGNOREREPLICATES因识别不到复制进程而不生效。
导致mysql 往 oracle同步时仍会抽取掉一部分数据往oracle走,而在我的 ORACLE 到MYSQL的同步中我实际是的关系是
O ———>O————>M 之后M再分别往两个O同步。
在《Administering Oracle GoldenGate for Windows and UNIX》手册上 9.3 Preventing Data Looping中介绍了各种数据库端如何识别复制进程的的参数,可以来防止抽取进程抽取复制进程的事务:
DB2 z/OS, DB2 LUW, DB2 for i, and Informix
TRANLOGOPTIONS EXCLUDEUSER user
Informix中需要特别使用
EXCLUDEUSERID
Database_uid
MySQL and NonStop SQL/MX
TRANLOGOPTIONS FILTERTABLE table_name
这个 table_name是指checkpointtable
Oracle
在复制进程设置标签,例如
DBOPTIONS SETTAG 0935
然后在抽取进程排除标签
TRANLOGOPTIONS EXCLUDETAG 0935
如果有多个标签,抽取进程必须每个都加上
当然也可用使用排除用户的
TRANLOGOPTIONS EXCLUDEUSER user
SQL Server
TRANLOGOPTIONS EXCLUDETRANS transaction_name
这个事务名不理解,如果未设置应该默认的事务名是 ggs_repl.。原文解释:
This parameter statement is only required if the Replicat transaction name is set to something other than the default of ggs_repl .
Sybase
TRANLOGOPTIONS EXCLUDETRANS transaction name
or
TRANLOGOPTIONS EXCLUDEUSER user name