最近接手一套OGG,开发人员抱怨有很多时间点的数据丢失,希望我们排查原因并解决问题。
首先着手了解ogg的功能:确认只开启dml,未开启ddl操作;然手找丢失数据的类型,主要从:
1、stats replicat 进程名字,发现insert、update、delete等dml操作都有操作记录,排除了该OGG不能同步update的猜测;
2、minus对比数据,发现部分表行数一直,但表内容有差别;部分表行数就缺;部分表行数和表内容完全一直。(个人表示萌萌的,毫无规律!)
3、查询丢数据或数据不一致的的时间点,发现时间点比较一致。也就是说都是某一时刻会集中有些insert或是update未能同步;
-----考虑中----
会不会是这样!(灵感突显后的兴奋)
跟源端dba确认,在丢丟数的时间点是否重新初始化过部分表,而且初始化的方式是基于scn的方式。得到的回复是肯定的。 那就明白了。
基于expdp+scn的方式初始化ogg,看似是绝对不会丢数据,但是忽略了数据库长事务问题。倘若做初始化的时刻,因为各种原因源端数据库依然进行着各种事务,并且部分事务是长事务。本来ogg是从在线日志或是归档日志中抽取sql,如果是数据库的长事务ogg处理起来就力不从心了。
找到原因就开始找解决办法了:
两个思路:1、重配,注意scn时刻事务问题,或是直接rman初始化;2,使用handlecolisions参数,配合基于时间点恢复启动replicat进程;
我选择了第二个,原因