SQL Server для передачи данных MySQL - PullRequest
9 голосов
/ 16 августа 2011

Я пытаюсь перенести объемные данные на постоянной и непрерывной основе из базы данных SQL Server в базу данных MYSQL. Я хотел использовать репликацию SSMS SQL Server, но это, очевидно, только для соединения SQL Server с Oracle или IBM DB2. В настоящее время мы используем SSIS для преобразования данных и передачи их во временную папку в базе данных MYSQL, где они копируются. Я хотел бы самый быстрый способ передачи данных и усложняю несколько методов.

У меня есть новый способ преобразования данных, который, я уверен, решит большинство временных проблем, но я хочу убедиться, что в будущем у нас не будет временных проблем. Я установил связанный сервер, который использует драйвер ODBC для MYSQL для связи между SQL Server и MYSQL. Это кажется ОЧЕНЬ медленным. У меня есть код, который также использует драйвер ODBC от Microsoft, но используется так мало, что я не могу измерить производительность. Кто-нибудь знает о молниеносных способах связи между этими двумя базами данных? Я исследовал поставщиков данных MYSQL, которые, кажется, взаимодействуют со слоем OleDB. Я не слишком уверен, во что верить и в какую сторону двигаться, какие-либо идеи?

Ответы [ 4 ]

1 голос
/ 02 сентября 2011

Я использовал мост jdbc-odbc в Java, чтобы сделать это в прошлом, но производительность через 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 вместо записи строка за строкой.В MySQL есть несколько существенных улучшений производительности для больших наборов данных, если вы загружаете infile и выполняете такие вещи, как атомарные перестановки таблиц.

Мы используем что-то подобное для быстрой загрузки больших файлов данных в 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
1 голос
/ 16 августа 2011

Лучший способ передачи данных SQL (если у вас есть место), который я нашел, - это дамп SQL на одном языке, а затем использовать программный инструмент для преобразования (или Perl-сценарий, оба распространены) для преобразования MSSQL для MySQL. Смотрите мой ответ на этот вопрос о том, какой конвертер вас может заинтересовать :).

0 голосов
/ 31 августа 2011

Cou также может попробовать следующее.http://kofler.info/english/mssql2mysql/

Я пробовал это раньше, и у меня это сработало.Но я не рекомендую это вам.В чем реальная проблема, что вы пытаетесь сделать?Разве вы не получаете соединение с БД MSSQL, например, из Linux?

0 голосов
/ 16 августа 2011

Мы использовали драйвер ado.net для mysql в ssis с небольшим успехом.В основном, установите драйвер на машину с установленными службами интеграции, перезапустите ставки, и он должен появиться в списке драйверов при создании менеджера соединений ado.net.

Что касается репликации, что именно вы пытаетесьвыполнить?

Если вы отслеживаете изменения, рассматривайте его как медленно меняющееся измерение типа 1 (применяется терминология хранилища данных, но применяется тот же принцип).Вставьте новые записи, обновите измененные записи.

Если вы заинтересованы только в новых записях и не планируете обновлять ранее загруженные данные, попробуйте стратегию инкрементальной загрузки.Вставьте записи, где source.id> max (destination.id).

После тестирования пакета запланируйте задание в агенте сервера sql для запуска пакета каждые x минут.

...