在实际数据迁移pg库为源库中中,存在主键类型为numeric(24)的情况
使用分片字段 则会失效,报错:
您配置的DataX切分主键(splitPk)有误. 因为您配置的切分主键(splitPk) 类型 DataX 不支持. DataX 仅支持切分主键为一个,并且类型为整数或者字符串类型. 请尝试使用其他的切分主键或者联系 DBA 进行处理.
又没有合适的分片字段,无法最大限度利用机器资源,决定看看源码。根据网上的教程安装教程
1.git clone
2.mvn -U clean package assembly:assembly -Dmaven.test.skip=true
(遇到相关报错:Assembly is incorrectly configured:等等 考虑是不是maven版本的问题,本人在3.9->3.6就好了)
3.在core 模块下 加上修改
System.setProperty(“datax.home”,“D:\SoftWare\datax”);
String[] datxArgs = {“-job”, “D:\SoftWare\datax\job\pgtomysql.json”, “-mode”, “standalone”, “-jobid”, “-1”};
设置文件地址datax地址。
4.定位到报错在这一块
断点一步步步入定位到
SingleTableSplitUtil.java–>isLongType()方法中
发现只有oralcle让用
// warn: Types.NUMERIC is used for oracle! because oracle use NUMBER to
// store INT, SMALLINT, INTEGER etc, and only oracle need to concern
// Types.NUMERIC
private static boolean isLongType(int type) {
boolean isValidLongType = type == Types.BIGINT || type == Types.INTEGER
|| type == Types.SMALLINT || type == Types.TINYINT;
switch (SingleTableSplitUtil.DATABASE_TYPE) {
case Oracle:
case OceanBase:
isValidLongType |= type == Types.NUMERIC;
break;
default:
break;
}
return isValidLongType;
}
稍加修改
重新启动,发现没效果?
DataX采用了框架 + 插件,读取的是主目录里面的plugin
把对应jar包替换即可
本人修改的是postgresqlreader 中的plugin-rdbms-util-> SingleTableSplitUtil
选择中编译后jar
粘贴到datax主目录
plugin\reader\postgresqlreader\libs 中即可
效果显著