共计 2882 个字符,预计需要花费 8 分钟才能阅读完成。
环境介绍:
源端:sybase 数据库,服务器字符集 iso_1,数据字符集 cp936;
目标端:Oracle11g,字符集 AL32UTF8。
replicat 进程错误:
ERROR OGG-03517 Conversion from character set zhs16gbk of source column CYXM to character set UTF-8 of target column CYXM failed because the source column contains a character that is not available in the target character set.
解决心路历程:
一开始遇到这个问题,懵了,这是什么鬼,CYXM 这个字段的字符转换错误?不对啊,logdump 看了一下数据,再去源库看数据,没什么错呀。goldengate 发什么疯,行吧,那我就根据前人的经验,使用 SOURCECHARSET PASSTHRU 这个参数。一重启,行啊,够给力的,进程不报错误了,数据库数据乱码了~ 呵呵哒。去看了官方介绍,原来 SOURCECHARSET PASSTHRU 这个参数是将我声明的源端字符集参数(ZHS16GBK)去掉,直接就将源端服务器字符集(ISO-8859-1)的数据插入进来,怪不得会乱码。看样子这个参数不能用。找了度娘好多次(目前还不会用 Google),最后总结出现这个问题的原因可能是:
1. sybase 的 cp936 字符集和 oracle 的 zhs16gbk 字符集是超集和子集的关系;
2. zhs16gbk 和 utf-8 字符转换存在编码问题。
故此,针对字符转换的问题,我是暂时没有解决方案了。但是突然想到,能不能跳过这个字符转换的错误呢?跑到 Goldengate 交流群上提问:
广州 -tan() 11:28:33
请问各位,Goldengate 的 replicat 进程设置了出现错误记录到 discart 文件中,但是,这次出现了一个 OGG-03517 的错误,它直接就 Abend 了,错误报告是这条记录的一个字段字符集转换错误,我检查了一下,应该是中文字符集超集与子集的原因 但是,目前 Oracle 的字符集对中文的支持就只能这样了,所以我想让它出现类似错误时,不 Abend,先记录 discard 文件 可以实现吗? 随风 () 11:30:24 可以 广州 -tan() 11:30:34 请问怎么设置? PONG() 11:30:38 用这个参数应该可以 随风 () 11:33:45 reperror(-03517,discard) 广州 -tan() 11:35:46 @随风 可以写多个 reperror 参数吗 随风 () 11:36:06 可以啊 广州 -tan() 11:36:21 reperror(OGG-03517,discard) reperror(Default,discard) 这样写? 随风 () 11:36:23 两个错误就写两个就行 随风 () 11:36:59 reperror(-03517,discard) 就这个写法 广州 -tan() 11:37:42 那两个错误,是写两个 reperror,还是写一个 reperror 随风 () 11:37:53 两个 写上不同错误号就行 广州 -tan() 11:38:16 恩,多谢 @随风 @PONG |
然后我就尝试使用 REPERROR 这个参数,想通过 discard 文件去捕获这个错误,不至于导致 REPLICATE 进程 ABEND 了,REPERROR 的使用方式如下:
|
将 prm 文件加入 REPERROR 参数后,我兴高采烈的 start replicat 进程,呵呵哒,还是 abend。然后又去上了度娘,发现,REPERROR 是可以捕获错误,但是 OGG 的错误,是没法捕获的啊~~~~。然后我又是一顿搜啊,最后在 oracle 的官方文档找到:
REPLACEBADCHARValid For Extract and Replicat Description Use the Default
Syntax
|
MY GOD, 我好像看到了救星,行了,就用你了。
我在 prm 文件中加入:
REPLACEBADCHAR SKIP NOWARING
目的:当出现某些字段的字符转换错误时,跳过此条记录,并不发出 WARING 信息。
注意:虽然官方解释道:如果使用 skip 选项,可能会导致数据不一致。但是吧,我这边使用该参数后,进程不报错了,数据也一致。我也在奇怪为什么会这个样子。不过现在进程至少不会因为这种字符转换的问题 abend 了,全部表的数据也能实时同步了。但是以后还是需要注意字符转换错误的那个表,看看数据是否一致,如果一致,那就不用鸟了。如果不一致,那只能再次排查,寻求解决方案了。
by the way,至于我为什么使用 NOWARING 选项,我喜欢,我高兴!
直接解决方案(不想看我一大堆废话的人儿):
REPLACEBADCHAR SKIP NOWARING
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133696.htm