资讯专栏INFORMATION COLUMN

oracle ogg同步目标库数据出现乱码处理

IT那活儿 / 1905人阅读
oracle ogg同步目标库数据出现乱码处理
点击上方“IT那活儿”,关注后了解更多精彩内容!!

环境

源端 os:Linux redhat 7,db 19.9 noncdb,ogg:19.1.0.0.4
目标端 os:Linux redhat 7,db 12.2 cdb,ogg:12.3.0.1.2
近期有一套Oracle数据库ogg完成同步部署,第二天应用反馈有张表数据的字段出现乱码,然后开始接手分析。

检查环境

1. 源库数据没有乱码,目标库有。

--源库数据:
--目标库数据:
2. 除了历史数据,增量同步数据也会产生乱码。
3. 源库是ZHS16GBK字符集,目标库是AL32UTF8字符集,从官方文档上查看,oracle是支持不同字符集之间同步。
4. 源库ogg版本高于目标库版本。
5. 源库DB版本高于目标库版本。

核查参数

1. 抽取进程
e_show2.prm

EXTRACT E_SHOW2
SETENV (ORACLE_HOME="/oracle/app/oracle/product/19.0.0/db" )
SETENV (ORACLE_SID="hncustdb11")
SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
userid ogg, password AACAAAAAAAAAAAQAMISHOEYDWBYEMJPGRBRIAFMGHCEEJINJ, encryptkey default
DISCARDFILE ./dirrpt/E_SHOW2.dsc,APPEND,MEGABYTES 1024
DBOPTIONS LOBBUFSIZE 1048576
TRANLOGOPTIONS DBLOGREADER
FETCHOPTIONS FETCHPKUPDATECOLS
CACHEMGR CACHESIZE 2GB
EXTTRAIL ./dirdat/E_SHOW2/t1,FORMAT RELEASE 12.3
BR BRINTERVAL 60M
GETTRUNCATES
TABLE UCR_CRM11.TF_F_USER;
......
2. 投递进程
d_show2.prm

EXTRACT D_SHOW2
PASSTHRU
SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
RMTHOST 10.***.***.164,MGRPORT 7809
RMTTRAIL ./dirdat/D_HNCUS1/t1,FORMAT RELEASE 12.3
TABLE *.*;


3. 复制进程


r_hncus1.prm

REPLICAT R_HNCUS1
SETENV (ORACLE_HOME="/u01/app/oracle/product/12.2.0.1/dbhome_1")
--SETENV (ORACLE_SID="showdb1")
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg@SHOWDB_WH1, password AACAAAAAAAAAAAPAMISHOEYDWBYEMJPGYILJRBWEGAZALJPE,encryptkey default
discardfile ./dirrpt/R_HNCUS1.dsc,append,megabytes 2048
sourcecharset passthru
grouptransops 2000
handlecollisions
maxtransops 500
gettruncates
dynamicresolution
ALLOWNOOPUPDATES
ASSUMETARGETDEFS
--reperror default,discard
map UCR_CRM11.TF_F_USER, target UCR_OGG_CRM11.TF_F_USER;
......


4. 环境变量

--源环境变量:
hncustdb11:/home/oracle(hncustdb11)$id
uid=1001(oracle) gid=1001(oinstall) groups=1001(oinstall),1000(dba),1003(oper),1004(asmdba),1006(backupdba),1007(dgdba),1008(kmdba)

hncustdb11:/home/oracle(hncustdb11)$env
--LANG 未设置:
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
--目标环境变量:
[oracle@exdadbadm01 ~]$ id
uid=1001(oracle) gid=1001(oinstall) groups=1001(oinstall),1002(dba),1003(racoper),1004(asmdba)

[oracle@exdadbadm01 ~]$ env

LANG=en_US.UTF-8
--NLS_LANG 未设置。
----分析:
  • 源库ogg版本高于目标库,抽取进程和投递进程都加上了FORMAT RELEASE 12.3,暂时排除该原因。

  • 源库和目标库字符集不一致,抽取和复制进程都指定了NLS_LANG,并且复制进程中加了sourcecharset passthru参数,并且按照文档上的说明支持不同字符集之间同步。

核查源库表出现乱码字段的字符集

排除以上原因,怀疑是源库的数据有部分非ZHS16GBK数据。对源库表上该字段进行dump。
未发现非ZHS16GBK数据。

测试同版本ogg是否会产生乱码


这个时候怀疑是ogg产品bug或者高低版本不兼容导致的,目标端有很多复制进程,但出问题的只有这一个,并且该问题可以100%重现。

在目标端另外一个节点安装19.1.0.0.4版本ogg,并建立测试表进行测试。
数据依然有乱码,说明和ogg版本不兼容没有关系。

检查源库和目标库表结构差异

在创建测试表的时候,留意到源库和目标库的部分字段长度和类型不一致,只要长度够长,ogg同步是不会断,怀疑是应用在目标库做了修改。
先进行测试,将源库的DDL取出来,在目标库建立测试表,在12版本的ogg下进行配置验证,发现乱码消失。

重现初始化

确定了乱码产生原因,重建目标端表结构,使用expdp方式进行初始化,发现报错提示数据超出字段长度。
不同字符集的数据,占用的长度也是不一致,ZHS16GBK字符集数据长度要大于AL32UTF8。
所以应该是当时做ogg部署的同事为了成功impdp导入数据,把字段长度改长了。但修改字段类型我是无法理解的。
既然无法使用expdp,那么就只能采用dblink+insert+scn的方式进行初始化了。
至此问题解决!


本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)

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

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

相关文章

  • DBASK问答集萃第四期

    摘要:问题九库控制文件扩展报错库的扩展报错,用的是裸设备,和还是原来大小,主库的没有报错,并且大小没有变,求解释。专家解答从报错可以看出,控制文件从个块扩展到个块时报错,而裸设备最大只支持个块,无法扩展,可以尝试将参数改小,避免控制文件报错。 链接描述引言 近期我们在DBASK小程序新关联了运维之美、高端存储知识、一森咖记、运维咖啡吧等数据领域的公众号,欢迎大家阅读分享。 问答集萃 接下来,...

    SKYZACK 评论0 收藏0
  • OGG Integrated Native DDL简单测试

    OGG Integrated Native DDL简单测试 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%;...

    IT那活儿 评论0 收藏1085

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

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