freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

运维日记| OGG表级别附加日志到底有多重要
FreeBuf_345712 2020-06-05 14:30:34 185399

在维护ogg这一段不长也不短的运维生涯中,总是接到客户反馈,“为什么我们的同步又中断了,日志显示ora-01403,找不到数据。可是我们确定目标端数据库没有人为删除修改数据,赶紧帮我们看看!”

了解或接触过ogg的人一般都知道,在部署OGG时有个前提条件是需要开启表级别附加日志。但大家却不一定清楚为什么已经开启了数据库级别的附加日志,却还需要为每个表添加附加日志。

下面美创小编用一个例子来告诉大家表级别附加日志的重要性!

当OGG进程遇到异常,查看进程状态时一般会看到下面这样的信息

image.png

上面这只是简单的进程信息,定位最终原因还是要查看具体日志。

如:查看ggserr.log日志

image.png

根据日志可以看到,ogg在执行sql语句时,发现需要去更新的记录不存在,具体sql语句和报错可以进一步查看discard文件(discard文件在ogg安装目录/dirrpt/路径下)

image.png

从discard文件中,我们可以清楚的看到这是一条简单的update语句,但是ID列的值为空,可是ID列又是这条update语句中的查询条件,所以无法定位到需要修改的记录,执行报错,无法找到数据。

那么问题来了:

为什么ID列会是空值呢?

凭借小编多年的ogg运维经验,怕是附加日志又没有添加。检查该表附加日志信息后,确认这张表没有添加附加日志,如下:

image.png

01  小知识:

Oracle日志(redo log)一般用于实例恢复和介质恢复,但是如果需要靠日志还原完整的DML操作信息(比如Goldengate),默认记录的日志量是不够的。对于insert、delete命令,在默认情况下产生的重做记录足以表明被修改的行的每个字段在被修改前后的值是什么。但是对于UPDATE的操作,redo默认只记录了rowid以及被修改的字段信息,但GoldenGate还原这个事务时,是在另一个库中进行还原,这时组成ROWID的四个部分(对象ID,数据文件ID,块号,行号)中,极可能是与原库不相同的,所以,不能根据ROWID来进行还原和处理。而要在SQL层面根据某个键值来定位记录,所以还需要将主键或者其他字段的信息附加到日志中去。要往日志中增加这些额外字段信息的操作,就是开启附加日志。

因为张表是ogg配置完成后新增的用户表,没有手动执行过add trandata添加附加日志。既然找到问题原因了,就可以按照正常操作来执行了。

知识拓展:

其实不仅仅是新增的用户表会存在这个问题,修改表结构,修改表名,修改主键这几种情况都会导致附加日志未添加或者失效,从而出现该报错。

那么难道每次业务上新增表,修改表都需要手动添加附加日志吗?这样工作量也太大了吧?太不智能了?

别急,OGG中有一个参数可以完美解决这个问题:ddloptions addtrandata

这个参数的官方文档解释如下:

image.png

1.允许oracle在创建表的时候自动添加附加日志

2.在修改表结构之后,自动更新附加日志

3.在修改表名之后,自动更新附加日志

4.在修改表主键之后,自动更新附加日志

小编在源端挖掘进程配置文件中添加ddloptions addtrandata参数后,再进行测试

image.pngimage.pngimage.png

这时可以看到新建表ddltest2的附加日志已经正确加上了,此时对表增删改数据都能正常同步。(对于没有主键的表,ogg会附加所有列的信息以此定位改动的数据具体是哪一条)

给该表添加主键后,附加日志为:

image.png

修改主键后执行update:

image.pngimage.png

修改主键后执行delete:

image.pngimage.png

均正常应用。

进一步验证,修改目标端记录:

image.png

生产端update操作:

image.png

目标端ogg同步提示找不到数据:

image.png

查看discard文件,可以看到,虽然和附加日志没有添加时报的错误相同,但是现在id主键字段的值是捕获到的,这次是真的没有该条记录,所以同步失败。

所以,在部署ogg时,添加表级别附加日志真的真的很重要,小伙伴们一定一定不要忘记!

参考文档:https://docs.oracle.com/goldengate/c1230/gg-winux/GWURF/ddloptions.htm#GWURF451

 


美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。

# 运维安全 # 数据库运维 # 运维 # 自动化运维
本文为 FreeBuf_345712 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
数据库运维
FreeBuf_345712 LV.1
这家伙太懒了,还未填写个人描述!
  • 69 文章数
  • 2 关注者
运维日记|SQL server 那点事
2020-09-03
运维日记|做一个查找机器
2020-08-26
运维日记|做一个优雅搬运工
2020-08-25