GoldenGate抽取进程延迟严重,论FETCHOPTIONS NOUSESNAPSHOT的重要性
1、案例概述
同事新搭建的一套GoldenGate环境,刚刚搭建时,Extract抽取进程就已经出现延迟现象,当时想着可能很快就能追平,所以最开始也没当回事。结果两天时间,延迟现象没有缓解,已经累积延迟30多个小时。通过info 或者 stats等命令查看进程状态信息, 发现该Extract抽取进程仍然在工作,只是抽取的速度比较慢。
2、处理过程
2.1 同事检查GoldenGate日志,没有发现任何异常的日志,只是Extract抽取进程延迟。 但检查数据库日志时,发现异常现象,数据库后台的alert日志提示大量的ORA-01555快照太旧的错误。
2.2 分析这些ORA-01555快照太旧的错误,发现这些报ORA-01555快照太旧的错误的SQL语句,durations几乎为0,同时SQL语句的格式为: select .... from .... as of scn :SCN where rowid=:ROWID; 这种SQL就非常奇怪,通过as of scn的关键字就可以看出,这是从快照中读取数据。
2.3分析gv$session和gv$sql视图,发现上述这些报ORA-01555快照太旧的错误的SQL语句的执行者竟然是GoldenGate的Extract抽取进程。
2.4 到此,大概明白了Extract抽取进程延迟的原因。 Extract抽取进程在抽取某些列的数据时,有两种选择:要么从快照中抽取,要么直接从表数据中抽取,然而默认是从快照中抽取,如果从快照中抽取失败,就会转而从表数据中抽取。每次都会做相同的操作,从而导致数据库后台日志报大量的ORA-01555快照太旧的错误,同时Extract抽取进程延迟。
2.5 明白了这个工作原理后,解决这个问题就非常简单了,直接在Extract抽取进程的配置文件中添加FETCHOPTIONS NOUSESNAPSHOT参数。也即改变抽取进程的默认行为,当需要抽取某些列的数据时,不从快照抽取,直接从表数据中抽取。
2.6 添加参数后,重启Extract抽取进程,观察发现Extract抽取进程工作效率大幅提升,累积延迟了30多个小时的数据,在短短的20分钟内追平。