在google code上开了一个java版的ETL小工具project:jmyetl

以前,曾经利用各数据库底层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,获取更丰富的信息,只是代码量可能比较大。

 

你可能感兴趣的:(java,数据库,Google,Sybase,constraints,工具)