暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【YashanDB认证】PG数据库使用DATAX迁移至YashanDB实战

原创 叶季安 2024-07-24
473

近期有一批数据需要从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);

WXWorkLocal_17217240189913.png

表结构迁移

由于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包。
WXWorkLocal_17217290791323.png

datax执行迁移及问题记录

python bin/datax.py job/pg2yas.json

列信息缺失

按照刚刚编辑好的json文件直接执行迁移,报错:您未配置读取数据库表的列信息. 正确的配置方式是给 column 配置上您需要读取的列名称,用英文逗号分隔. 例如: “column”: [“id”, “name”],请参考上述配置并作出修改
WXWorkLocal_17217284686300.png
仔细一看是postgresqlreader报的错,回头检查示例的json模版,发现源端没有要求写入column信息。
不过既然报错了,就在源端和目标端都添加以下column的信息。
WXWorkLocal_17217285939895.png
再重新执行迁移流程,不再报错column配置不全。

写入模式(writeMode)配置有误

WXWorkLocal_17217289023812.png
这个是个很奇怪的问题,明明写入模式的writeMode这里什么都没有填写啊。
所以回头看了下DATAX的rdbmswriter的源码:
WXWorkLocal_17217287788704.png
比较有用的信息就是这个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。
WXWorkLocal_17217292797674.png

job.setting.speed.channel值非法

查了下网上其他人的记录,发现只要把channel这一项改成1就可以了。
WXWorkLocal_17218116438254.png

完成数据迁移

现在可以正常完成数据迁移了,这里留一个修改完全后的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" } } } }

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

WXWorkLocal_17218117625548.png
发现数据已经完全写入,只是timestamp类型有末尾精度丢失的情况,这个需要再另行处理了,可能是rdbmswriter在迁移的过程中精度适配导致的。

总结

总体来说用datax迁移PG的数据到YashanDB还是比较简单的,主要麻烦的点在于需要手动处理表结构迁移,以及rdbmswriter对类型适配的支持可能不够完善。
这里也希望YashanDB官方能够早日提供适配的datax的yashanreader和yashanwriter插件到社区中,方便更多的数据迁移流程!

另外附一个YashanDB的YCA报名渠道:https://www.yashandb.com/YCA_courses

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论