Mysql
 sql >> Base de données >  >> RDS >> Mysql

Transfert de données SQL Server vers MySQL

J'ai utilisé le pont jdbc-odbc en Java pour faire cela dans le passé, mais les performances via ODBC ne sont pas excellentes. Je suggérerais de regarder quelque chose comme http://jtds.sourceforge.net/ qui est un pilote Java pur que vous pouvez déposer dans un simple script Groovy comme celui-ci :

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
}

Les chiffres de performances suivants vous donnent une idée de ses performances :http://jtds.sourceforge.net /benchTest.html

Vous pouvez trouver des avantages en termes de performances à vider les données dans un format de fichier de vidage mysql et à utiliser mysql loaddata au lieu d'écrire ligne par ligne. MySQL a des améliorations de performances significatives pour les grands ensembles de données si vous chargez des infile et faites des choses comme des échanges de tables atomiques.

Nous utilisons quelque chose comme ça pour charger rapidement de gros fichiers de données dans mysql d'un système à un autre, par ex. C'est le mécanisme le plus rapide pour charger des données dans mysql. Mais ligne par ligne en temps réel pourrait être une simple boucle à faire dans groovy + une table pour garder une trace de la ligne qui a été déplacée.

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