问题概述
生产上一条Oracle 19c–>PG 12.4 OGG同步链路复制进程发生abend,查看进程report报告,提示如下ERROR信息:
问题原因
查阅PG官方论坛https://www.postgresql.org/message-id/45DAE076.1060407%40opencloud.com,对此报错进行了描述:
大体意思为PG本身存在一些限制,不支持0x00字符存储,另外也从Oracle MOS Doc ID 2351708.1得到验证:
PG不支持0x00字符存储。
解决方案
对于此问题,本文从技术层面提供了3种方法进行解决:
方法1:在数据库层面,可以手动修改源端表row数据,将’\0000’字符替换为’'空字符:
在源端Oracle数据库表中找到存在hex(16进制) 00的行:
select * from SCHEMA.TABLE where instr(external_id , unistr(‘\0000’)) > 0;
对存在hex(16进制) 00的行数据进行替换:
update SCHEMA.TABLE Set external_id = replace (external_id , unistr (‘\0000’), ‘’) where instr(external_id , unistr(‘\0000’)) > 0;
方法2:在OGG软件层面,通过修改复制进程RBA号来跳过报错记录,此过程需要借助logdump工具。对于报错记录再通过手动方式进行补录。具体操作过程比较繁琐,操作过程略。
方法3:在OGG软件层面,使用字符映射文件进行处理。
首先,在OGG复制端的./dirprm目录下创建一个映射文件-charmap.txt,文件内容为:
SOURCECHARSET ZHS16GBK
TARGETCHARSET UTF-8
\x00 \x20
注意:SOURCECHARSET后面接源端字符集类型
然后,添加如下内容至复制进程参数文件内:
CHARMAP /opt/goldengate/dirprm/char.txt
最后,重新启动复制进程生效:
start rep*
总结:推荐使用方法3,通过字符映射可以做到一劳永逸。
参考文档
OGG Replicat for PostgreSQL Fails With “SQL error 3452617 ERROR: VERROR; invalid byte sequence for encoding “UTF8”: 0x00” (Doc ID 2351708.1)