Триггеры MySQL + репликация с несколькими базами данных

StackOverflow https://stackoverflow.com/questions/98275

  •  01-07-2019
  •  | 
  •  

Вопрос

Я использую несколько баз данных в MySQL 5.0.45 и пытаюсь синхронизировать свою устаревшую базу данных с пересмотренной схемой, чтобы я мог запускать обе базы данных параллельно.Я делаю это, добавляя триггеры в новую базу данных, но у меня возникают проблемы с репликацией.Моя установка следующая.

Сервер «мастер»

  • База данных «legacydb» реплицируется на «ведомый» сервер.
  • База данных «newdb» имеет триггеры, которые обновляют «legacydb» и не выполняют репликацию.

Сервер «раб»

  • База данных «legacydb»

Мои обновления «newdb» работают нормально и запускают мои триггеры.Они обновляют «legacydb» на «главном» сервере.Однако изменения не реплицируются на подчиненные устройства.В документации MySQL говорится, что для простоты репликация смотрит на текущий контекст базы данных (например, "SELECT DATABASE();" ) при принятии решения о том, какие запросы реплицировать, а не при просмотре продукта запроса.Мой триггер запускается из контекста базы данных «newdb», поэтому репликация игнорирует обновления.

Я попытался переместить оператор обновления в хранимую процедуру в «legacydb».Это отлично работает (т.данные реплицируются на подчиненное устройство), когда я подключаюсь к «главному» и запускаю вручную "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);".Однако когда эта процедура вызывается из триггера, она не реплицируется.

До сих пор мои мысли о том, как это исправить, были следующими.

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

  • Реплицируйте обе базы данных и используйте триггеры как на главном, так и на подчиненном устройстве.Это было бы возможно, но настроить сложно.

  • Заставьте репликацию захватить все изменения в «legacydb», независимо от текущего контекста базы данных.

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

Любая помощь в том, как этого добиться, будет принята с благодарностью.

Это было полезно?

Решение

Это может иметь какое-то отношение к этому:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top