Я запускаю пару баз данных на MySQL 5.0.45 и пытаюсь синхронизировать мою устаревшую базу данных с пересмотренной схемой, поэтому я могу работать как бок о бок. Я делаю это, добавляя триггеры к новой базе данных, но у меня возникают проблемы с репликацией. Моя настройка такова.MySQL триггеров + репликация с несколькими базами данных
Сервер "мастер"
- базы данных "legacydb", реплицируется на сервер "ведомым".
- База данных «newdb» имеет триггеры, которые обновляют «legacydb» и не реплицируются.
Сервера "ведомые"
- База данных "legacydb"
Моих обновлений для "NEWDB" работать нормально, и отправились мои триггера. Они обновляют «legacydb» на «master» сервере. Однако изменения не реплицируются до подчиненных. Документы MySQL говорят, что для простоты репликация рассматривает текущий контекст базы данных (например, "SELECT DATABASE();"
) при принятии решения о том, какие запросы реплицироваться, а не смотреть на продукт запроса. Мой триггер запускается из контекста базы данных «newdb», поэтому репликация игнорирует обновления.
Я попытался переместить инструкцию обновления в хранимую процедуру в «legacydb». Это работает отлично (т. Е. Данные реплицируются на подчиненный), когда я подключаюсь к «ведущему» и запускаю вручную "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);"
. Однако, когда эта процедура вызывается из триггера, она не реплицируется.
До сих пор мое размышление о том, как исправить это, было одним из следующих.
Установить триггер, чтобы установить новую текущую базу данных. Это было бы проще всего, но я не думаю, что это возможно. Это то, чего я надеялся достичь с помощью хранимой процедуры.
Репликация обеих баз данных и наличие триггеров как в главном, так и в ведомом. Это было бы возможно, но боль была настроена.
Внесите репликацию, чтобы получить все изменения в «legacydb», независимо от текущего контекста базы данных.
Если репликация выполняется на слишком высоком уровне, она никогда не увидит никаких обновлений, запускаемых моим триггером, и в этом случае никакое количество хакеров не достигнет того, что я хочу.
Любая помощь по достижению этого была бы весьма признательна.
В принципе, верный путь для обновления базы данных, и если есть триггера в реплицированной базе данных, или хранимые функции, они также должны существовать в базе данных подчиненных. Существуют также ограничения на то, как писать триггеры и функции, чтобы они сами реплицировались. – Chris 2008-09-19 03:37:23