OGG表级别附加日志到底有多重要?
在小编维护ogg这一段不长也不短的运维生涯中,总是接到客户反馈,“为什么我们的同步又中断了,日志显示ora-01403,找不到数据。可是我们确定目标端数据库没有人为删除修改数据,赶紧帮我们看看!”
了解或接触过ogg的人一般都知道,在部署OGG时有个前提条件是需要开启表级别附加日志。但大家却不一定清楚为什么已经开启了数据库级别的附加日志,却还需要为每个表添加附加日志。
下面小编用一个例子来告诉大家表级别附加日志的重要性!
当OGG进程遇到异常,查看进程状态时一般会看到下面这样的信息
上面这只是简单的进程信息,定位最终原因还是要查看具体日志。
如:查看ggserr.log日志
根据日志可以看到,ogg在执行sql语句时,发现需要去更新的记录不存在,具体sql语句和报错可以进一步查看discard文件(discard文件在ogg安装目录/dirrpt/路径下)
从discard文件中,我们可以清楚的看到这是一条简单的update语句,但是ID列的值为空,可是ID列又是这条update语句中的查询条件,所以无法定位到需要修改的记录,执行报错,无法找到数据。
为什么ID列会是空值呢?
凭借小编多年的ogg运维经验,怕是附加日志又没有添加。检查该表附加日志信息后,确认这张表没有添加附加日志,如下:
01
小知识:
Oracle日志(redo log)一般用于实例恢复和介质恢复,但是如果需要靠日志还原完整的DML操作信息(比如Goldengate),默认记录的日志量是不够的。对于insert、delete命令,在默认情况下产生的重做记录足以表明被修改的行的每个字段在被修改前后的值是什么。但是对于UPDATE的操作,redo默认只记录了rowid以及被修改的字段信息,但GoldenGate还原这个事务时,是在另一个库中进行还原,这时组成ROWID的四个部分(对象ID,数据文件ID,块号,行号)中,极可能是与原库不相同的,所以,不能根据ROWID来进行还原和处理。而要在SQL层面根据某个键值来定位记录,所以还需要将主键或者其他字段的信息附加到日志中去。要往日志中增加这些额外字段信息的操作,就是开启附加日志。
因为张表是ogg配置完成后新增的用户表,没有手动执行过add trandata添加附加日志。既然找到问题原因了,就可以按照正常操作来执行了。
知识拓展:
其实不仅仅是新增的用户表会存在这个问题,修改表结构,修改表名,修改主键这几种情况都会导致附加日志未添加或者失效,从而出现该报错。
那么难道每次业务上新增表,修改表都需要手动添加附加日志吗?这样工作量也太大了吧?太不智能了?
别急,OGG中有一个参数可以完美解决这个问题:ddloptions addtrandata
这个参数的官方文档解释如下:
1.允许oracle在创建表的时候自动添加附加日志
2.在修改表结构之后,自动更新附加日志
3.在修改表名之后,自动更新附加日志
4.在修改表主键之后,自动更新附加日志
小编在源端挖掘进程配置文件中添加ddloptions addtrandata参数后,再进行测试
这时可以看到新建表ddltest2的附加日志已经正确加上了,此时对表增删改数据都能正常同步。(对于没有主键的表,ogg会附加所有列的信息以此定位改动的数据具体是哪一条)
给该表添加主键后,附加日志为:
修改主键后执行update:
修改主键后执行delete:
均正常应用。
进一步验证,修改目标端记录:
生产端update操作:
目标端ogg同步提示找不到数据:
查看discard文件,可以看到,虽然和附加日志没有添加时报的错误相同,但是现在id主键字段的值是捕获到的,这次是真的没有该条记录,所以同步失败。
所以,在部署ogg时,添加表级别附加日志真的真的很重要,小伙伴们一定一定不要忘记!
参考文档:https://docs.oracle.com/goldengate/c1230/gg-winux/GWURF/ddloptions.htm#GWURF451
OGG表级别附加日志到底有多重要?相关推荐
- oracle 附加日志 挂起,Oracle 附加日志(supplemental log)
附加日志(supplemental log)可以指示數據庫在日志中添加額外信息到日志流中,以支持基於日志的工具,如邏輯standby.streams.GoldenGate.LogMiner.可以在數據 ...
- 解读MySQL事务的隔离级别和日志登记模式选择技巧
转自于: http://www.mysqlops.com/2011/04/25/mysql-isolation-binlog.html MySQL的四种事务隔离级别:Read-uncommitted. ...
- [20160813]12c开启附加日志问题.txt
[20160813]12c开启附加日志问题.txt --测试需要要在12c下开启附加日志,遇到一些问题,做1个记录: 1.环境: SCOTT@test01p> @ ver1 PORT_STRIN ...
- Log4j.xml配置日志按级别过滤并将指定级别的日志发送到ActiveMQ
为什么80%的码农都做不了架构师?>>> 在之前的一篇博客<Spring+Log4j+ActiveMQ实现远程记录日志--实战+分析>的评论中,有同学提到这种方式应 ...
- linux activemq 打印日志,Log4j.xml配置日志按级别过滤并将指定级别的日志发送到ActiveMQ...
目标:将debug,info级别的日志输出到本地文件,将warn,error级别的日志输出到ActiveMQ. 说明:本文还是使用之前的两个项目:Product和Logging. 经过一番搜索后,发现 ...
- 数仓基于表级别的数据血缘分析
1.背景:数据血缘分析在日常的处理过程中非常重要,其分为应用级别.表级别和字段级别三种.在数据处理过程中,需要知道目标表的字段是来源于哪张原始表.对于简单的hsql来说我们很容易可以知道目标表的来源, ...
- 今天聊聊L2级别自动驾驶到底是个什么鬼?
L2级别智能(自动)驾驶,几乎成了今年上市新车的必备关键词,无论合资还是自主的上市新车的辅助驾驶系统均向L2级智能驾驶看齐.自动驾驶是未来的发展方向,毋庸置疑.虽然受数据带宽局限,目前只能在指定区域小 ...
- java slf4j日志级别_SLF4J日志级别以及使用场景
为什么要使用日志 在项目开发的过程中, 添加合适的日志是一个必不可少的过程,给程序添加合适的日志有以下两个好处. 可以通过查看日志的输出,了解程序的运行状况,判断程序是否按预期进行运行. 程序出现bu ...
- mysql replicate-rewrite-db_replicate-rewrite-db和Replicate_Wild_Do_Table实现表级别映射复制
将3306 实例下sakila 的两张表actor 同步到5725 实例下的ming 数据库中. 初始化数据 mysqldump -uroot -poracle -q --single-transac ...
- 智能驾驶是什么意思_今天聊聊L2级别自动驾驶到底是个什么鬼?
L2级别智能(自动)驾驶,几乎成了今年上市新车的必备关键词,无论合资还是自主的上市新车的辅助驾驶系统均向L2级智能驾驶看齐.自动驾驶是未来的发展方向,毋庸置疑.虽然受数据带宽局限,目前只能在指定区域小 ...
最新文章
- 数据结构图之二(最小生成树--克鲁斯卡尔算法)
- 360金融产品总监赵鑫:互金产品经理应该关心这些东西
- Python操作MySQL数据库的三种方法
- BBQ Hard dp + 组合数学 + 建模
- COLLATE oracle,Sql 中Collate用法
- 对mysql进行压力测试_mysqlslap对mysql进行压力测试
- nginx启用https访问
- 把Sublime添加到Mac右键菜单
- HP工作站如何在BIOS下开启、关闭安全芯片
- 鼠标指针下总出现一个滚动条似的方框,怎么办?有图
- python 使用twilio免费发送短信
- 21秋北京中医药大学《有机化学Z》平时作业1
- 螺旋传动设计系统lisp_螺旋传动设计
- App Inventor 2能编译出苹果iOS版App吗?
- window下配置qemu虚拟机联网
- 二十一世纪“新元宇宙”奇幻小说作品系列连载
- arcmin 弧分的转换
- 付宇泽四则运算试题生成,结对
- CSS——景深perspective属性
- 触摸控制灯带_玛克君arduino