Хотя я не совсем убежден, что это хорошая идея, я понимаю, что это может быть необходимо в некоторых случаях использования (см. Последний абзац), поскольку у нас было аналогичное требование недавно.
Этоработал довольно хорошо:
На отправляющей стороне (независимо от того, что это, в вашем случае SQL-сервер)
- создать таблицу 'changelog', имеющую id (pk), tablename,tablepk, action, текстовое поле для данных
- создать триггеры в соответствующих таблицах, которые записывают изменения в таблицу изменений после успешного завершения операции
- ваш код передает содержимое таблицы изменений в отправляющуюсторона
- Если это успешно, удалите его из таблицы изменений (помните: здесь возможны условия гонки!)
На принимающей стороне (независимо от того, что это такое, в вашем случае MySQL)
- получить данные журнала изменений
- проанализировать их
- запустить изменения для базы данных
- , если это работает, отправить подтверждение
Этосхема работает довольно хорошо, даже между двумя хостами, которые могут «общаться» только HTTP между ними - это также довольно надежно, поскольку потерянное соединение (или перезагрузка принимающей стороны) просто буферизует изменения в таблице изменений на стороне отправки, очищаяпосле восстановления соединения.