起因:
在使用OGG升级迁移过程中,已经完成了数据迁移切换,配置了反向的同步进程,开发反馈新库缺少一个应用用户,于是dba在新库创建了该用户,授予表的权限,由于旧库并没有此用户,DDL操作通过反向的OGG进程同步到旧库,导致OGG应用进程挂掉,查看report,报错是有DDL操作。
ERROR OGG-00519 Fatal error executing DDL replication:error [Error code [972],
解决方案1:
OGG应用进程跳到指定的RBA
查询当前应用的trail文件和RBA:
info xxxrep
可以看到当前应用的tail文件名:
lt000000000
RBA 541120
查询ggcsi目录:
which ggsci
/u01/app/extract/ggsci
进到ggsci目录下:
cd /u01/app/extract/ggsci
打开logdump:
./logdump
打开tail文件:
Logdump 8> open /u01/app/extract/dirdatrccd2/lt000000000
跳到当前RBA位置
Logdump 8> pos 541120
再输入
Logdump 8> n
可以看到,下一个RBA要执行的操作
例如:
2017/07/05 08:40:51.937.520 DDLOP Len 1236 RBA 542487
Name: UCR_TRADE_02.TF_B_ORDER
After Image: Partition 4 G b
0000 0018 0000 0014 3137 3037 3035 3038 3430 3532 | ........170705084052
3730 3933 3331 3235 0001 000a 0000 0000 0000 0000 | 70933125............
0019 0002 0022 0000 001e 3130 3034 3031 3130 3930 | ....."....1004011090
3431 3730 3730 3530 3834 3035 3231 3131 3239 3631 | 41707050840521112961
0003 0004 0000 3034 0004 0005 0000 3031 3700 0500 | ......04......017...
0500 0031 3631 0006 0004 ffff 0000 0007 0004 ffff | ...161..............
0000 0008 0015 0000 3230 3137 2d30 372d 3035 3a30 | ........2017-07-05:0
其中第一行的DDLOP表示该操作是DDL操作。于是可以用n继续跳过
直到找到
非DDL操作的,例如:
2017/07/05 08:40:51.937.520 Insert Len 1022 RBA 767800
Name: RCCDB200.XXX.AAA_BBB_T (TDR Index: 16)
After Image: Partition 0xc G s
0000 0018 0000 0014 3137 3037 3035 3038 3430 3532 | ........170705084052
3730 3933 3331 3235 0001 000a 0000 0000 0000 0000 | 70933125............
0019 0002 0022 0000 001e 3130 3034 3031 3130 3930 | ....."....1004011090
3431 3730 3730 3530 3834 3035 3231 3131 3239 3631 | 41707050840521112961
0003 0004 0000 3034 0004 0005 0000 3031 3700 0500 | ......04......017...
0500 0031 3631 0006 0004 ffff 0000 0007 0004 ffff | ...161..............
0000 0008 0015 0000 3230 3137 2d30 372d 3035 3a30 | ........2017-07-05:0 -
这条的操作是insert
记录下这条insert的RBA为767800
退出logdump:
exit
再打开ggsci
ggsci
指定RBA启动OGG复制进程
allter REPLICAT RCCDREP2,extseqno 0,extrba 767800
start RCCDREP2
这样就能跳过报错DDL操作了。
以上是比较笨的办法,logdump其实可以直接跳转到当前事务结束的RBA,也可以设置过滤条件。
一些logdump操作命令:
查看下一条正常的记录:
Logdump 8> SCANFORHEADER
可以直接输入简写:SFH
查看事务的结束位置:
Logdump 9> SCANFORENDTRANS
也可以直接输入简写:SFET.
这个命令会显示下一个事务的第一记录,此时,TransInd的标志应该是0x00
基于表或文件名过滤
如只查看某个表的数据
Logdump 10> FILTER INCLUDE FILENAME [container | catalog] schema.table
设置之后,使用 N 命令,只有符合条件的表的记录才会显示。也可以使用Exclude参数不看某个表的记录。
清除当前过滤条件
FILTER CLEAR
使用过滤条件可以更快找到下一条合适的记录
查看header record信息
Logdump 15 >ghdr on查看详情
Logdump 16 >detail onLogdump 17 >detail data
查看用户定义的token
Logdump 18 >usertoken on解决方案2
在复制进程中配置忽略DDL操作
打开ggsci
ggsci
编辑复制进程参数
edit param RCCDREP2
加入以下参数,保存
DDLERROR DEFAULT IGNORE RETRYOP
重新启动复制进程
start RCCDREP2
也可以等待OGG进程运行正常后,再取注释掉这条参数,保证后面正常的DDL操作可以同步
官方文档参考:
https://www.ateam-oracle.com/post/oracle-goldengate-logdump
https://docs.oracle.com/goldengate/1212/gg-winux/GLOGD/wu_logdump.htm#GLOGD112