Подтвердить что ты не робот

Проблемы с репликацией на основе строк на основе MySQL по самому себе

Я пытаюсь использовать Библиотека репликации MySQL Replication для выполнения репликации данных между HostA и HostB.

Репликация основана на строках, отличных от операторов. Я знаю, что в MySQL есть такая встроенная функция, но я хочу сделать это сам --- Чтение всех изменений строки из журнала журнала HostA и внесение всех этих изменений в HostB.

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

Возьмем пример, предположим, что синхронизированная база данных TestSyncDB, и в ней есть две таблицы, которые являются Data и DataOp. В таблице данных есть триггер с ней, и как только запись будет вставлена ​​в эту таблицу, триггер создаст новую запись в DataOp.

Теперь новая запись вставляется в HostA.TestSyncDB.Data, так как есть триггер, поэтому в базе данных будет две записи, а библиотека List Replication List вернет мне два запроса, например:

  • вставить в значения HostA.TestSyncDB.Data(...)
  • вставить в значения HostA.TestSyncDB.DataOp(...)//с помощью триггера

Проблема заключается в том, что если я перепроверку этих двух запросов на HostB, в таблицах будут добавлены три новые записи в HostA.TestSyncDB из-за триггеров. Тогда данные никогда не будут правы.

Итак, как это решить? Можно временно отключить триггеры? Если нет, как сделать это правильно, как то, что делает репликация MySQL?

4b9b3361

Ответ 1

В репликации mysql, когда вы создали триггер на master, он будет создан на подчиненном устройстве. Поэтому, если вам нужен другой триггер на подчиненном устройстве, вы можете отредактировать этот триггер или отказаться, если не хотите. Для формата репликации, если ваш мастер binlog binlog_format = ROW, он будет копироваться как мастер, не подходит для триггеров, если подчиненный хочет другое действие триггера, а затем мастер как ваша ситуация. В этой ситуации binlog требует утверждения на основе binlog_format = STATEMENT. Так возможно ли в mysql переключать b/w эти два по мере необходимости.

Итак, ключевой момент: вам нужно binlog_format = MIXED. Он достаточно умен, чтобы решить, когда использовать STATEMENT и когда использовать ROW. Для этой ситуации это будет иметь значение STATEMENT BASED. В другом случае он будет работать как ROW BASED.

Вы можете прочитать здесь более- формат репликации и Преимущества и недостатки

Ответ 2

Я не думаю, что вы можете отключить триггеры в MySQL.
Но вы можете найти решение по адресу:
mysql-disable-all-triggers

Я бы лично просто сбросил триггеры на HostB, и тогда я чувствую, что повторное использование двоичных журналов на основе ROW не должно быть проблемой.