以前,曾经利用各数据库底层C-API作wrapping,实现了若干异构数据库间数据导入导出的功能,但是代码复杂,不便开源。
下午,用java写了一个简单的数据抽取程序,实现MySQL数据库到Sybase ASE的数据移植。将它开源,放到:http://code.google.com/p/jmyetl/ 上边了。本来取名做myetl,结果已经有人在sf.net上申请了,后来在其前加上一个j。以示java版本。
有兴趣的可以试用一下。
目前,可以是某用户的全库数据导入,也可以选择性的导入若干张表。
因为刚实现一个初步框子,所以定为0.9.0版。
打算以后有空再写些别的库间ETL,最后再重构,组合。
使用方法:
当前目录下边有一个xml配置文件etl_config.xml,其格式如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <source> <type>mysql</type> <host>localhost</host> <port>3306</port> <user>test</user> <pwd>password1</pwd> <db>test</db> <charset>gbk</charset> <!-- table is an optional element, if not specified, all the tables will be transfered. --> <!-- <table>t</table> <table>tblob</table> --> </source> <target> <type>ase</type> <host>sean-laptop</host> <port>5000</port> <user>test</user> <pwd>password1</pwd> <db>demo</db> <charset>eucgb</charset> <!-- table element will be ignored in the target element. --> </target> </root>
直接运行myEtl.bat即可实现导入。如果去掉<table>那一块的注释,则全库导入。
注意字符集选项,如果没有这个配置,很容易出现乱码。
目前的限制条件是:
不要使用数据库超级用户来配置连接,因为目前程序里边没有对系统表进行过滤。
后期计划:
Sybase ASE --> Sybase ASE
Sybase ASA --> Sybase ASE
Sybase ASE --> Sybase ASA
Oracle --> Sybase ASE
DB2 --> Sybase ASE
SQL Server --> Sybase ASE
逆向导入,以后有时间再做。
已有功能:
1. 能保持表结构几乎一致,类型兼容
2. 日志文件etl.log里会记录导入的详细过程以及中间可能出现的出错信息
3. 目标表,会建立与源表一样的主键结构
4. 目标表会创建与源表一致的identity信息
5. 通过字符集一致性配置,会保持源表中的字符集到目标表,不致乱码。
待改进功能:(下述功能,是细致一些的功能,适用目的不同,如果只是简单的抽取数据,则不需要)
1. 添加与源表一致的foreign key constraints (这个稍微有点复杂,会增加导入时间)
2. 添加与源表一致的index功能,即附加创建的索引也在目标表上体现出来
其实,以前用C++ wrapper实现的原理与java版本比较接近,相比JDBC而言,它能操纵更多底层的API,获取更丰富的信息,只是代码量可能比较大。