首页 » GoldenGate, MySQL, ORACLE » Troubleshooting OGG Char datatype from mysql to ogg fill chr(0)

Troubleshooting OGG Char datatype from mysql to ogg fill chr(0)

前几年处理过一个<当C语言的程序处理 chr(0) or ‘\0’ 时的ORA-01008 Case>故障案例, 近期又遇到一个案例是在Golden Gate同步数据时遇到的问题,发现ogg在同步时对于char类型的字段,不足指定长度时,OGG使用的是chr(0)补充, 而对于已有数据是默认chr 32(空格)补充,导致无法匹配问题。

一套mysql to oracle的OGG同步环境,源端mysql—字符集utf8,目标端oracle—字符集16gbk, 某年某月某一天告警OGG进程异常中断,通过查看日志发现是discard文件写满了,discard内容如下:

No data found
Operation failed at seqno 20 rba 13264
Discarding record on action DISCARD on error 1403
Problem replicating SCHEMA1.TABLE1 to SCHEMA2.TABLE2.
Record not found
Mapping problem with compressed update record (target format) SCN:000000000000000000079:000001052294414...
*
ID = 10000000002706
ORDER_NBR = 1000000002724
USER_ID = 1000000000*****
ADDRESS_ID = 10000000001180
APPOINTMENT_DATE = NULL
APPOINTMENT_HOUR = NULL
CHANNEL_ID = 522253060
CHANNEL_NAME = NULL
MARKET_ACCOUNT = 13100000000
000000: 31 33 33 36 33 30 36 37 34 30 30                |13100000000     |

MARKET_TYPE = 1
000000: 31                                              |1               |

STAFF_ID = NULL
AREA_ID = 130400
TOTAL_PRICE = 9900
000000: 39 39 30 30                                     |9900            |

EXT_SERVICE_PRICE = 3000
000000: 33 30 30 30                                     |3000            |

PAYMENT_ID = NULL
EXT_ORDER_ID = NULL
REMARK = NULL
ORDER_STATUS = 22
PRINT_RECEIPT = 0
ORDER_TYPE = 4
SEND_ERROR_TIME = NULL
VERSION = 0
ORI_ORDER_ID = NULL

Note:
从报错看像是个多列记录的update, 报错的原因是not data found,记录未匹配到。手动根据其中一列(非PK列)校验,目测目标库中也是存在该记录,未发现明显异常。

这时常用的做法要么把应用打印出sql,手动去执行;
logdump trail file对比数据是否在目标库存在;


后来分析存在以下几种上情况:

1, ogg insert同步正常
2, 对于ogg insert同步到目标端的,后期ogg update 同步正常。
3, 对于非使用ogg初始化同步到目标端的,后期ogg update同步有正常, 也有不正常,提示上面的错误记录无法匹配。

去oracle数据库中使用dump函数对比记录不同时发现,PK列,为char(20), 该类型在oracle中处理时,如果是insert值不足指定长度时,后面用空格补充。对比发现
对于以空格结尾的数据也就是非OGG初始化的数据,OGG同步异常;而使用OGG同步insert的记录,列后补充的是chr(0);

从ogg 转换为SQL输出后发现insert的数据对应补充确实是\00 (chr(0))如下图:

这也就解释了上面的问题,如果PK列值的长度刚好满足字段char长度,OGG同步正常, 而对于初始化补“空格”,而OGG匹配时补”\00″的就无法匹配。

SQL> drop table test;
Table dropped.

SQL> create table test(v char(10));
Table created.

SQL> insert into test values ('a');
1 row created.

SQL> select length(v) from test;
 LENGTH(V)
----------
        10
SQL> select dump(v) from test;

DUMP(V)
---------------------------------------------
Typ=96 Len=10: 97,32,32,32,32,32,32,32,32,32

SQL> select * from test where v='a';
V
----------
a

SQL> select * from test where v='a           ';
V
----------
a

SQL> insert into test values ('b'||chr(0));

1 row created.

SQL> select * from test where v='b';
no rows selected

SQL> select * from test where v='b    ';
no rows selected

SQL> select * from test where v like 'b%';
V
----------
b

所以除了上面同步的问题,对于用chr 0 补充对于应用检索存在问题,对此问题联系到了oracle原厂,推测是字符集问题,但还应该是要OGG去解决。变通的解决方法将源端MySQL字段类型更改为varchar,目标端Oracle更改为varchar2问题得以解决。

打赏

对不起,这篇文章暂时关闭评论。