2008-09-19 3 views
4

Я запускаю пару баз данных на 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», независимо от текущего контекста базы данных.

  • Если репликация выполняется на слишком высоком уровне, она никогда не увидит никаких обновлений, запускаемых моим триггером, и в этом случае никакое количество хакеров не достигнет того, что я хочу.

Любая помощь по достижению этого была бы весьма признательна.

ответ

3

Это может иметь что-то делать с ним:

Хранимая функция получает блокировку таблицы перед выполнением, чтобы избежать несогласованности в двоичный файл регистрации из-за несоответствия порядка, в котором заявления исполнения и, когда они появляются в журнале , Записи, вызывающие функцию, записываются, а не операторы, выполняемые внутри функции. Следовательно, хранимые функции, которые обновляют одни и те же базовые таблицы, не выполняются параллельно.

Напротив, хранимые процедуры не имеют блокировки на уровне таблицы. Все заявления, выполняемые в хранимых процедурах, записываются в двоичный журнал.

Кроме того, есть целый список вопросов с триггерами: http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

+0

В принципе, верный путь для обновления базы данных, и если есть триггера в реплицированной базе данных, или хранимые функции, они также должны существовать в базе данных подчиненных. Существуют также ограничения на то, как писать триггеры и функции, чтобы они сами реплицировались. – Chris 2008-09-19 03:37:23

 Смежные вопросы

  • Нет связанных вопросов^_^