作者:Digital Observer(施嘉伟) Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、 PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证 ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师 公众号:Digital Observer;CSDN:施嘉伟;ITPUB:sjw1933;墨天轮:Digital Observer;PGFans:施嘉伟。
一 描述
数据逻辑同步是基于行的同步,逻辑同步的前提是开启附加日志,例如在默认情况下,我们在源端执行UPDATE,目标端是无法知道我们update修改的数据是哪行数据,因此我们需要使用主键来标识我们修改的这行数据,但是主键默认情况下是不存在于我们的redo log中,因此我们需要开启附加日志,开启附加日志的目的就是将主键作为附加信息添加到redo log中,这样在目标端就可以获取到在源端发生修改的行。
优点: 1.可实现数据逻辑同步。 2.可以使用Oracle logminer工具实现DML误删除以及误修改的恢复。
缺点: 1.由于redo log会记录更多的内容,因此会增加少量的归档日志,大约十分之一,如果当前环境下归档保留比较极限,建议调整归档日志保留策略。
二 开启流程
- 避免业务高峰期开启
- 开启前确保没有大事物进行,语句如下:
set linesize 200 set pagesize 5000 col transaction_duration format a45 with transaction_details as ( select inst_id , ses_addr , sysdate - start_date as diff from gv$transaction ) select s.username , to_char(trunc(t.diff)) || ' days, ' || to_char(trunc(mod(t.diff * 24,24))) || ' hours, ' || to_char(trunc(mod(t.diff * 24 * 60,24))) || ' minutes, ' || to_char(trunc(mod(t.diff * 24 * 60 * 60,60))) || ' seconds' as transaction_duration , s.program , s.terminal , s.status , s.sid , s.serial# from gv$session s , transaction_details t where s.inst_id = t.inst_id and s.saddr = t.ses_addr order by t.diff desc
- 强制日志以及附加日志开启 (首先确保当前环境归档日志已经开启)
开启强制日志模式:
alter database force logging;
(由于Oracle中具有nologging插入选项,开启force logging后,nologging选项将失效,可以确保数据同步,如果不开启,源端执行nologging不记录日志的数据插入,那么将影响数据同步)
开启数据库层面最小附加日志记录:
alter database add supplemental log data;
开启需要同步的具体表的列附加日志。
alter table xxx.xxx add supplemental log data(all) columns;
4.等待事件监控
select event,count(*) from gv$session where wait_class<>’Idle’ group by event;
如果出现多个异常等待时间,将附加日志开启命令中断即可。
