1.1 故障描述
使用DATAX工具从oracle库同步10张表至oceanbase数据库。
工作原理:使用oraclereader读取插件从oracle库读取数据,通过oceanbasev10writer写插件将数据写入到oceanbase数据库。
写入数据时,DATAX日志报错:
java.lang.NumberFormatException: multiple points
1.2 问题分析
开始分析DATAX运行日志,通过下面的日志可以判断,DATAX已经连到oracle并开始准备往oceanbase写数据,说明json文件没有问题。

继续往下分析:

从第5行datax代码报错开始查看,发现是oceanbasev10writer\src\main\java\com\alibaba\datax\plugin\writer\oceanbasev10writer\task\ConcurrentTableWriterTask.java 包中有报错,打开oncurrentTableWriterTask的jar包。
查看136行的源代码:

观察上下文代码,Float.valueOf() 是用于截取有效位数,这段代码目的是要比较OceanBase的版本号是否>=2.1,进而将OBflag重置为ture。
查询当前oceanbase数据库的版本号是:

查询老版本oceanbase数据库的版本号是:

发现oceanbase数据库升级版本后,新版本version值中加入了字母和特殊字符从而导致版本判断失败,导致程序执行报错。
1.3 故障处理
当前使用的datax版本是v202205,查看最新的源码,发现版本判断部分的代码已经弃用,我们可以把136行版本判断的代码注释,不再进行版本判断直接开始操作。或者使用最新的datax版本替换旧版本。


替换jar包后,重新发起datax同步,datax日志显示不再判断version,程序会继续运行。

拓展:
源码中lastIndexOf()和Float.valueOf()的用法,以老版本为例,版本号:3.2.1,执行此处源码后得到结果如下:

新版本号:3.2.3.2 ,执行结果如下:

报错:使用Oceanbasev10Reader插件新功能readByPartition同步报错。
2.1 故障描述
Datax新版本Oceanbasev10Reader插件增加了一个新功能。
功能名称:readByPartition。
功能描述:对分区表是否按照分区切分任务。和oracle的数据泵导出方式一样了,oracle数据泵导出分区表时同样是按照分区同时抽取数据,这样能极大提升数据抽取效率。
编写json开始测试,json格式如下:
"reader": {
"name": "oceanbasev10reader",
"parameter": {
"username": "USER1",
"password": "PWD1",
"column": ["*"],
"readByPartition": "true",
"connection": [
{
"jdbcUrl":[ "||_dsc_ob10_dsc_||obqf:qf||_dsc_ob10_dsc_||jdbc:oceanbase://1.1.1.1:8888/name"],
"table": [
"TABLE1"
]
}
]
}
}
发起同步后,却同步失败了。查看日志:

2.2 故障处理
发现源库和目标库已登录成功,在目标库已经执行了presql操作,说明登录部分是没有问题的。
源库的列查看部分也是正常的,问题出在读取分区部分。
查看源码:

问题很明显了,当前主机使用的DATAX版本和报错一中的版本是同一版本,也是由于版本判断前提过不去导致分区查询失败,进程不能继续推进导致。
处理方法:
屏蔽版本判断部分的代码;
在datax 官网下载最新tar包进行替换。

本文作者:辛志梁(上海新炬中北团队)
本文来源:“IT那活儿”公众号





