资讯专栏INFORMATION COLUMN

处理GoldenGate添加附加日志报错ORA-02257

IT那活儿 / 822人阅读
处理GoldenGate添加附加日志报错ORA-02257
一. 背景介绍

去年协助客户某云化项目(将部分老旧的Oracle数据库(Uinx + 9i)迁移至Linux + MySQL 5.7),其中部分数据库使用导出导入的方式可以搞定(数据量小、可停机时间长),但是其中部分数据库迁移要求尽量停机时间短,数据质量要求高, 割接当晚需要验证目标端及源端的数据一致,故针对这部分数据库迁移选择使用GoldenGate作为同步工具来实现。


二. 报  错 

在源端配置GoldenGate的时候,使用add trandata为需要同步的表添加表级附加日志,检查输出日志发现部分表报错 OGG-00706 && ORA-02257,添加附加日志不成功。


三. 报错处理

通过MOS搜索相关文档得知,该报错只发生在Oracle 9i 且没有主键的情况下为超过33列的表添加表级附加日志时会出现报错(参考Doc ID 1357001.1 ,Doc ID 1357001.1)),从MOS上得知该报错解决的办法也很简单,只需要将原来的添加一个supplemental log group 拆分成多个日志组,一个日志组包含33个列,剩余列放在另一个日志组,如下:


四. 进阶处理

处理过程中发现这些业务表的列设计的非常多,甚至大大超过了33列,上百个或者几百个列,而且是有很多表都存在这个情况,如下图查询所示(T001表为建立的测试表),显示很多表列的个数已经超过了100个,在GoldenGate同步的时候如果每一张表都手工来处理实在是费时费力,效率太低。

于是想办法通过拆分表的列,用SQL来拼接添加附加日志的脚本,经过一番折腾过后,最终成品如下图所示,当然最后可以用shell脚本循环跑一下需要的表,就可以全部轻松搞定:


附拆分column脚本:

Set line 32767 pages 0
set long 99999999
set feedback off
set heading off 
--set wrap off
set tab off
set trimspool on
set trimout on
set termout off
col ddl for a300
Select alter table  || Owner || . || Table_Name ||
        add supplemental log group  || Table_Name || _ || Max_Id || ( ||
       Column_Name || ) always; As Ddl
  From (Select Owner,
               Table_Name,
               Substr(Column_Name, 1, Length(Column_Name) - 1) As Column_Name,
               Max(Col_Id) As Max_Id
          From (Select Owner,
                       Table_Name,
                       Ceil(Column_Id / 30) As Col_Id,
                       Replace(Replace(Replace(To_Char(Xmlagg(Xmlelement(e, Column_Name, ,).Extract(//text()) Order By Column_Id)
                                                       .Getclobval()),
                                               Chr(13),
                                               ),
                                       Chr(10),
                                       ),
                               Chr(9),
                               ) As Column_Name
                  From Dba_Tab_Columns
                 Where Table_Name = T001
                   And Owner = PERFSTAT
                 Group By Owner, Table_Name, Ceil(Column_Id / 30)
                 Order By 3)
         Group By Owner, Table_Name, Column_Name
         Order By 4);

END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129833.html

相关文章

  • 一步一步搭建前端监控系统:JS错误监控篇

    摘要:摘要徒手写错误监控。为什么用定时器呢,因为在单页应用中,路由的切换和地址栏的变化是无法被监控的,我确实没有想到特别好的办法来监控,所以用了这种方式,如果有人有更好的办法,请给我留言,谢谢。 摘要: 徒手写JS错误监控。 作者:一步一个脚印一个坑 原文:搭建前端监控系统(二)JS错误监控篇 Fundebug经授权转载,版权归原作者所有。 背景:市面上的监控系统有很多,大多收费,对于...

    EdwardUp 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<