我过去使用 Java 中的 jdbc-odbc 桥来完成此操作,但通过 ODBC 的性能不是很好。我建议查看http://jtds.sourceforge.net/ 之类的东西,它是一个纯 Java 驱动程序,您可以将其放入一个简单的 Groovy 脚本中,如下所示:
import groovy.sql.Sql
sql = Sql.newInstance( 'jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName',
'username', 'password', 'net.sourceforge.jtds.jdbc.Driver' )
sql.eachRow( 'select * from tableName' ) {
println "$it.id -- ${it.firstName} --"
// probably write to mysql connection here or write to file, compress, transfer, load
}
以下性能数据可让您大致了解它的性能:
http://jtds.sourceforge.net/benchTest.html
您可能会发现将数据转储为 mysql 转储文件格式并使用 mysql loaddata 而不是逐行写入的一些性能优势。如果您加载 infile 并执行诸如原子表交换之类的操作,MySQL 对大型数据集有一些显着的性能改进。
我们使用这样的东西快速将大型数据文件从一个系统加载到 mysql 到另一个系统,例如这是将数据加载到 mysql 中最快的机制。但是实时逐行可能是一个简单的循环,可以在 groovy + 一些表中执行,以跟踪已移动的行。
mysql> select * from table into outfile 'tablename.dat';
shell> myisamchk --keys-used=0 -rq '/data/mysql/schema_name/tablename'
mysql> load data infile 'tablename.dat' into table tablename;
shell> myisamchk -rq /data/mysql/schema_name/tablename
mysql> flush tables;
mysql> exit;
shell> rm tablename.dat