问题现象
OceanBase Oracle 模式下,通过 ODC 导入 CSV 单表文件时,报错日志中提示导入的数据和列不匹配。
报错信息示例:
2021-12-08 10:11:36 [WARN] Retry Table: "T_3" Partition: 0 Records: 2 Error: ORA-01722: invalid number
2021-12-08 10:11:36 [ERROR] T_3 loaded failed, as the max errors: 1 is exceeded
2021-12-08 10:11:36 [ERROR] Error occurred when loading data into "CHZ"."T_3"
java.sql.SQLException: ORA-01722: invalid number
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1973) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1838) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1728) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:359) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.jdbc.JDBC4PreparedStatement.executeInternal(JDBC4PreparedStatement.java:229) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.jdbc.JDBC4PreparedStatement.execute(JDBC4PreparedStatement.java:158) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.jdbc.JDBC4PreparedStatement.executeUpdate(JDBC4PreparedStatement.java:190) ~[oceanbase-client-2.2.6-SNAPSHOT.jar!/:?]
at com.oceanbase.tools.loaddump.utils.JdbcUtils.executeUpdate(JdbcUtils.java:296) ~[ob-loader-dumper-2.3.1-SNAPSHOT.jar!/:?]
at com.oceanbase.tools.loaddump.writer.database.DatabaseWriter$RetryCallback.call(DatabaseWriter.java:550) ~[ob-loader-dumper-2.3.1-SNAPSHOT.jar!/:?]
at com.oceanbase.tools.loaddump.writer.database.DatabaseWriter$RetryCallback.call(DatabaseWriter.java:438) ~[ob-loader-dumper-2.3.1-SNAPSHOT.jar!/:?]
at com.github.rholder.retry.AttemptTimeLimiters$NoAttemptTimeLimit.call(AttemptTimeLimiters.java:78) ~[guava-retrying-2.0.0.jar!/:?]
at com.github.rholder.retry.Retryer.call(Retryer.java:160) ~[guava-retrying-2.0.0.jar!/:?]
at com.oceanbase.tools.loaddump.writer.database.DatabaseWriter.onEvent(DatabaseWriter.java:308) [ob-loader-dumper-2.3.1-SNAPSHOT.jar!/:?]
at com.oceanbase.tools.loaddump.writer.database.DatabaseWriter.onEvent(DatabaseWriter.java:71) [ob-loader-dumper-2.3.1-SNAPSHOT.jar!/:?]
at com.lmax.disruptor.WorkProcessor.run(WorkProcessor.java:143) [disruptor-3.4.2.jar!/:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_275]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_275]
at java.lang.Thread.run(Thread.java:874) [?:1.8.0_275]
问题原因
ODC 内部使用 OBLOADER 组件导入数据,OBLOADER 在 list column 时按照 column_id 排序列。而部分版本的 OceanBase Oracle 模式下,select all_tab_cols 返回的列顺序与实际的顺序不匹配,导致导入时 CSV 配置列映射时匹配关系会出错,从而 INSERT 失败。
影响的版本
ODC V3.2.2 及之前的版本。
解决方法
升级至 ODC V3.2.3 及之后的版本 ,ODC V3.2.3 版本已修复该缺陷。
如使用 ODC V3.2.3 之前的版本,可以配置错误的映射关系忽略。