近期有一批数据需要从PG迁移到Yashan,正好在学习datax,这里记录一下用DATAX将数据从PG迁移到YashanDB的迁移的流程和实战中遇见的问题。
源端数据准备
首先在PG侧准备好需要被迁移的数据,这里用一个很简单的test表作为示例:
create table test(col0 int primary key,col1 text,col2 timestamp);
insert into test values(1,'yashan迁移测试',CURRENT_TIMESTAMP);
insert into test values(2,'yashan迁移测试',CURRENT_TIMESTAMP);

表结构迁移
由于DATAX只是数据迁移工具,无法通过DATAX创建表结构,所以需要手动在YashanDB端事先创建好空表。
同时PG和YashanDB是异构数据库,存在一些数据类型不兼容的问题,也需要在这个时间进行处理,根据具体的业务逻辑修改为对应的类型。
在本处示例中,由于YashanDB不存在text类型,所以需要变更,在此处变更为varchar(100 char)类型
create table test(col0 int primary key,col1 varchar(100 char),col2 timestamp);
如果是整库的表结构迁移,可以考虑使用pg_dump将整库的表结构SQL都导出来,然后拿到YashanDB去执行,通过错误信息去修正表结构。
数据迁移
DATAX安装
DATAX直接使用官方提供的最新版本:https://github.com/alibaba/DataX
根据DATAX的官方文档,准备好基础的环境:
[datax@localhost datax]$ java -version java version "11.0.14" 2022-01-18 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.14+8-LTS-263) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.14+8-LTS-263, mixed mode) [datax@localhost datax]$ python -V Python 2.7.5
然后下载官方编译好的工具包,解压到本地即可。
tar -xf datax.tar.gz
DATAX 配置文件模版生成
检查了一下DATAX下的插件,可以看到官方直接有提供postgresqlreader,选择postgresqlreader作为源库的插件。
目标端没有专门的yashandbreader,但是可以用通用的rdbmswriter作为目标端的插件。
先生成job的模板:
python bin/datax.py -r postgresqlreader -w rdbmswriter
执行以上命令后会在屏幕上输出模版json的格式。
在job文件夹下生成pg2yas.json的文件用于存储迁移的job配置,然后将模版json的格式粘贴到pg2yas.json中。
touch job/pg2yas.json [datax@localhost datax]$ cat job/pg2yas.json { "job": { "content": [ { "reader": { "name": "postgresqlreader", "parameter": { "connection": [ { "jdbcUrl": [], "table": [] } ], "password": "", "username": "" } }, "writer": { "name": "rdbmswriter", "parameter": { "column": [], "connection": [ { "jdbcUrl": "", "table": [] } ], "password": "", "preSql": [], "session": [], "username": "", "writeMode": "" } } } ], "setting": { "speed": { "channel": "" } } } }
DATAX job配置
然后可以根据job模版json中所需要的信息,填入必要的迁移配置项,包括源端和目标端的jdbc url信息、迁移的表名和数据库连接的用户名和密码。
[datax@localhost datax]$ cat job/pg2yas.json { "job": { "content": [ { "reader": { "name": "postgresqlreader", "parameter": { "connection": [ { "jdbcUrl": ["jdbc:postgresql://192.168.23.161:5432/postgres"], "table": ["test"] } ], "password": "postgres", "username": "postgres" } }, "writer": { "name": "rdbmswriter", "parameter": { "column": [], "connection": [ { "jdbcUrl": "jdbc:yasdb://192.168.23.161:1688/yasdb", "table": ["test"] } ], "password": "yasdb_123", "preSql": [], "session": [], "username": "SYS", "writeMode": "" } } } ], "setting": { "speed": { "channel": "" } } } }
最后在datax/plugin/writer/rdbmswriter/libs/这个路径里上传yashandb的jdbc包。

datax执行迁移及问题记录
python bin/datax.py job/pg2yas.json
列信息缺失
按照刚刚编辑好的json文件直接执行迁移,报错:您未配置读取数据库表的列信息. 正确的配置方式是给 column 配置上您需要读取的列名称,用英文逗号分隔. 例如: “column”: [“id”, “name”],请参考上述配置并作出修改

仔细一看是postgresqlreader报的错,回头检查示例的json模版,发现源端没有要求写入column信息。
不过既然报错了,就在源端和目标端都添加以下column的信息。

再重新执行迁移流程,不再报错column配置不全。
写入模式(writeMode)配置有误

这个是个很奇怪的问题,明明写入模式的writeMode这里什么都没有填写啊。
所以回头看了下DATAX的rdbmswriter的源码:

比较有用的信息就是这个don’t use的警告…根据代码推测,按照模板,不填写的writeMode状态下,传入wirteMode这个变量的不是null而是空串,导致触发了writeMode的校验,所以报错。
将json串中writeMode这一项删除后不再报这个错。
No suitable driver found for jdbc
很常见的报错,应该是YashanDB的jdbc驱动的DriverName忘记写了。
找到datax/plugin/writer/rdbmswriter/路径下的plugin.json文件,在drivers的数组内加上YashanDB JDBC的driver名称:com.yashandb.jdbc.Driver。

job.setting.speed.channel值非法
查了下网上其他人的记录,发现只要把channel这一项改成1就可以了。

完成数据迁移
现在可以正常完成数据迁移了,这里留一个修改完全后的json示例:
{
"job": {
"content": [
{
"reader": {
"name": "postgresqlreader",
"parameter": {
"column": ["col0","col1","col2"],
"connection": [
{
"jdbcUrl": ["jdbc:postgresql://192.168.23.161:5432/postgres"],
"table": ["test"]
}
],
"password": "postgres",
"username": "postgres"
}
},
"writer": {
"name": "rdbmswriter",
"parameter": {
"column": ["col0","col1","col2"],
"connection": [
{
"jdbcUrl": "jdbc:yasdb://192.168.23.161:1688/yasdb",
"table": ["test"]
}
],
"password": "yasdb_123",
"preSql": [],
"session": [],
"username": "SYS"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}

最后检查数据库内部数据量情况:

发现数据已经完全写入,只是timestamp类型有末尾精度丢失的情况,这个需要再另行处理了,可能是rdbmswriter在迁移的过程中精度适配导致的。
总结
总体来说用datax迁移PG的数据到YashanDB还是比较简单的,主要麻烦的点在于需要手动处理表结构迁移,以及rdbmswriter对类型适配的支持可能不够完善。
这里也希望YashanDB官方能够早日提供适配的datax的yashanreader和yashanwriter插件到社区中,方便更多的数据迁移流程!
另外附一个YashanDB的YCA报名渠道:https://www.yashandb.com/YCA_courses




