基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
如何处理 Store 组件遇到乱码记录检查点停滞不前的问题
更新时间:2026-06-23 06:11
本文为您介绍 Store 组件遇到乱码记录检查点停滞不前的原因和解决方法。
适用版本
适用于 OceanBase 迁移服务(OceanBase Migration Service,OMS)全部版本。
问题描述
OMS 源端为 Oracle 数据库,目标端为 OceanBase 数据库。在控制台的数据迁移项目详情页面显示增量同步延迟不断增大,通过查看组件监控信息,发现问题在于 Store 组件的延迟较大,并且检查点一直保持不动。 经检查发现 connector.log 日志量巨大,有大量重复的报错:ORA-17154: cannot map Oracle character to Unicode。
日志示例如下:
[2023-06-21 13:44:10.531] [ERROR] [Record Selector-108] [error code:17154, use flashback query this time:false](OracleBackRecordQueue.java:960)
[2023-06-21 13:44:10.531] [ERROR] [Record Selector-108] [back query update times:0record:{rowid: AABJH5AxxxxAAI , xid: 1.0x00672e.xxx.01b0 , table: NGCRM_JM.PC_PROD_SALE_CUxxx, type: UPDATE , timestamp: 1687270448 , oldPkOrUk: CUSTGRPID=U15447xxxx89 and SERVNUMBER=閳ワ拷367xxx1124 , newPkOrUk: CUSTGRPID=U15447xxxx89 and SERVNUMBER=閳ワ拷3672851124 }
SQLException:](OracleBackRecordQueue.java:816)
java.sql.SQLException: ORA-17154: cannot map Oracle character to Unicode
at oracle.i18n.text.converter.CharacterConverter12Byte.toUnicode(CharacterConverter12Byte.java:183)
at oracle.i18n.text.converter.CharacterConverterGBK.toUnicodeString(CharacterConverterGBK.java:92)
at oracle.sql.converter.I18CharacterConvertersWrapper.toUnicodeString(I18CharacterConvertersWrapper.java:85)
at oracle.sql.CharacterSetWithConverter.toString(CharacterSetWithConverter.java:188)
at oracle.sql.CharacterSetUTF.convert(CharacterSetUTF.java:259)
at oracle.jdbc.driver.OraclePreparedStatement.setCHARInternal(OraclePreparedStatement.java:5972)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7650)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7619)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8374)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:8349)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:221)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.setObject(DruidPooledPreparedStatement.java:477)
at com.taobao.drc.logminer.type.OracleTypeParser$Varchar2Parser.setString(OracleTypeParser.java:1554)
at com.taobao.drc.logminer.type.OracleTypeParser.setString(OracleTypeParser.java:217)
at com.taobao.drc.logminer.queue.OracleBackRecordQueue$RecordSelector.selectUpdateRecord(OracleBackRecordQueue.java:765)
at com.taobao.drc.logminer.queue.OracleBackRecordQueue$RecordSelector.doSelectRecord(OracleBackRecordQueue.java:488)
at com.taobao.drc.logminer.queue.OracleBackRecordQueue$RecordSelector.selectRecord(OracleBackRecordQueue.java:442)
at com.taobao.drc.logminer.queue.OracleBackRecordQueue$RecordSelector.run(OracleBackRecordQueue.java:410)
问题原因
OMS 在数据同步时遇到乱码记录,触发了 ORA-17154,无法自行恢复。
解决方法
修改 Store 组件的参数,添加
"deliver2store.logminer.ignore_error_code":string"17154"配置来忽略报错。参数ignore_error_code的含义为:查询record时,指定忽略哪些 Oracle 错误码,多个错误码之间使用 "|" 分隔。说明
通过该方式会忽略此种类型的变更,您需要手动在目标端订正数据。
进入 查看组件监控 对话框。
登录 OMS 控制台。
在左侧导航栏,单击 数据迁移。
在 迁移项目列表 页面,单击目标项目的名称进入详情页面。
在项目详情页面,单击右上角的 查看组件监控。
在 查看组件监控 对话框,单击 Store 组件后的 更新。
在 更新配置 对话框,鼠标悬停至
root参数旁边的空白处,单击添加图标。输入需要添加的 Key Name 为
deliver2store.logminer.ignore_error_code,单击对号。在
更新配置对话框,找到新增的 Key Name,其默认值为 NULL。鼠标悬停至新增参数,单击显示的编辑图标,修改参数值为
17154。修改参数值后,单击确认图标。在 更新配置 对话框,单击 确定。
对于被忽略的记录,您可以在
connector.log日志中查找。[2023-06-21 13:56:56.065] [WARN] [Record Selector-65] [skip record by config ignore_error_code. record:{rowid: AABJH5ABxxxxxAAI , xid: 1.0x00672e.000xxxx.01b0 , table: NGCRM_XX.PC_PROD_SALE_CUxxxxxNO , type: UPDATE , timestamp: 1687270448 , oldPkOrUk: CUSTGRPID=U15447xxxxx89 and SERVNUMBER=閳ワ拷3672xxxx4 , newPkOrUk: CUSTGRPID=U1544xxxxxx689 and SERVNUMBER=閳ワ拷36728xxxxx4 }](OracleBackRecordQueue.java:450) [2023-06-21 14:18:00.024] [WARN] [Record Selector-17] [skip record by config ignore_error_code. record:{rowid: AABJH5AxxxxkkpABi , xid: 1.0x006752.00xxxxxb.01c0 , table: NGCRM_XX.PC_PROD_SALE_CUxxxxO , type: UPDATE , timestamp: 1687272302 , oldPkOrUk: CUSTGRPID=201702xxxx25 and SERVNUMBER=閳ワ拷367xxxx124 , newPkOrUk: CUSTGRPID=201702xxxx025 and SERVNUMBER=閳ワ拷3672xxxx1124 }](OracleBackRecordQueue.java:450) [2023-06-21 14:31:37.843] [WARN] [Record Selector-59] [skip record by config ignore_error_code. record:{rowid: AABJH5xxxxxsAAI , xid: 1.0x006769.0xxxxfc.0174 , table: NGCRM_XX.PC_PROD_SALE_CUxxxxO , type: UPDATE , timestamp: 1687273350 , oldPkOrUk: CUSTGRPID=U1544758xxxxx9 and SERVNUMBER=閳ワ拷322xxxxx17 , newPkOrUk: CUSTGRPID=U15xxxx5x8413689 and SERVNUMBER=閳ワ拷3226xx11717 }](OracleBackRecordQueue.java:450) [2023-06-21 14:36:42.430] [WARN] [Record Selector-72] [skip record by config ignore_error_code. record:{rowid: AABJH5Axxxx845ABi , xid: 1.0x006770.0xxxxac1f.00d8 , table: NGCRM_XX.PC_PROD_SALE_CUSxxxxNO , type: UPDATE , timestamp: 1687273728 , oldPkOrUk: CUSTGRPID=2022xxxxx94 and SERVNUMBER=660xxx3(閸忥拷), newPkOrUk: CUSTGRPID=2022xxxx709x394 and SERVNUMBER=6607293(閸忥拷) }](OracleBackRecordQueue.java:450)根据
connector.log日志中的rowid进入 Oracle 数据库订正数据,或者通过离线迁移的方法同步问题记录至 OceanBase 数据库。说明
乱码可能引发的
ORA-报错很多,本文仅为一个示例,其它报错也适用。