Односторонняя синхронизация между SQL Server и MySQL - PullRequest
2 голосов
/ 09 февраля 2012

Я пытаюсь синхронизировать таблицы MySQL с таблицами из SQL Server 2008. Я хочу, чтобы на пути была синхронизация от сервера SQL к MySQL. Я уже перенес таблицы из SQL Server в MySQL, и все, что мне сейчас нужно, это код PHP, который будет обновлять таблицу (проверять изменения, вставлять новые строки, удалять несуществующие) автоматически при каждом запуске. Кто-нибудь может мне помочь?

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

Хотя я не совсем убежден, что это хорошая идея, я понимаю, что это может быть необходимо в некоторых случаях использования (см. Последний абзац), поскольку у нас было аналогичное требование недавно.

Этоработал довольно хорошо:

На отправляющей стороне (независимо от того, что это, в вашем случае SQL-сервер)

  • создать таблицу 'changelog', имеющую id (pk), tablename,tablepk, action, текстовое поле для данных
  • создать триггеры в соответствующих таблицах, которые записывают изменения в таблицу изменений после успешного завершения операции
  • ваш код передает содержимое таблицы изменений в отправляющуюсторона
  • Если это успешно, удалите его из таблицы изменений (помните: здесь возможны условия гонки!)

На принимающей стороне (независимо от того, что это такое, в вашем случае MySQL)

  • получить данные журнала изменений
  • проанализировать их
  • запустить изменения для базы данных
  • , если это работает, отправить подтверждение

Этосхема работает довольно хорошо, даже между двумя хостами, которые могут «общаться» только HTTP между ними - это также довольно надежно, поскольку потерянное соединение (или перезагрузка принимающей стороны) просто буферизует изменения в таблице изменений на стороне отправки, очищаяпосле восстановления соединения.

1 голос
/ 24 апреля 2012

Я бы порекомендовал иметь столбец меток времени в каждой таблице, и каждый раз, когда вы вставляете или обновляете, обновляете значение метки времени каждой затронутой строки. Затем вы перебираете все таблицы, проверяя, является ли отметка времени более новой, чем та, которая у вас есть в целевой базе данных. Если это новее, то проверьте, нужно ли вставлять или обновлять. Замечание 1: знать о физическом удалении, так как строки удаляются из исходной базы данных, и вы должны сделать то же самое на сервере базы данных. Вы можете решить эту проблему, избегая физического удаления или регистрируя каждое удаление в таблице с временными метками. Что-то вроде этого: DeletedRows = (id, имя_таблицы, pk_column, pk_column_value, отметка времени) Итак, вы должны прочитать все новые строки таблицы DeletedRows и выполнить удаление на сервере, используя table_name, pk_column и pk_column_value. Замечание 2: знать о FK, поскольку вставка данных в таблицу, связанную с другой таблицей, может завершиться неудачно. Вы должны отключить каждый FK перед синхронизацией данных.

1 голос
/ 09 февраля 2012

Я думаю, что PHP здесь не имеет ничего общего.

Вы можете использовать различные решения, такие как:

  • SSIS
  • DTS пакеты
  • Связанные серверы
  • Триггеры + таблицы очередей синхронизации
  • различные сторонние инструменты ETL
  • ...
1 голос
/ 09 февраля 2012

Что может пригодиться для использования - это инструмент ETL.Одним из разработанных для SQL Server является SSIS.Может быть возможно использовать это, чтобы помочь ввести данные, которые вы хотите, но я никогда не использовал их для MySQL раньше.Согласно этому посту [http://blogs.msdn.com/b/mattm/archive/2008/03/03/connecting-to-mysql-from-ssis.aspx] это действительно возможно.

Еще один пост, который может вам помочь: http://www.packtpub.com/article/mysql-data-transfer-using-sql-server-integration-services-ssis

К сожалению, последняя статья описывает его от MySQL до SQLСервер, который не в нужном вам направлении.Может быть возможно заставить это работать другим способом, но вам может понадобиться найти инструмент ETL для MySQL.Я не знаю ни о чем из головы, хотя быстрый поиск в Google показал http://www.benetl.net/, но я не могу ручаться за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...