Spec-Zone.ru › MySQL 8.4

19.5.1.36 Репликация и триггеры

При репликации на основе инструкций триггеры, выполняемые на источнике, также выполняются на реплике. При репликации на основе строк триггеры, выполняемые на источнике, не выполняются на реплике. Вместо этого изменения строк на источнике, возникшие в результате выполнения триггера, реплицируются и применяются на реплике.

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

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

Инструкция, вызывающая триггер (или функцию), которая вызывает обновление AUTO_INCREMENT столбца, не реплицируется правильно при использовании репликации на основе инструкций. MySQL 8.4 помечает такие инструкции как небезопасные. (Ошибка #45677)

Триггер может иметь триггеры для разных комбинаций события триггера (INSERT, UPDATE, DELETE) и времени действия (BEFORE, AFTER), и разрешено несколько триггеров.

Для краткости, “несколько триггеров” здесь является сокращением для “несколько триггеров, у которых одинаковое событие триггера и время действия.”

Обновления. Несколько триггеров не поддерживаются в версиях, более ранних, чем MySQL 5.7. Если вы обновляете серверы в топологии репликации, использующие версию, более раннюю, чем MySQL 5.7, сначала обновите реплики, а затем обновите источник. Если обновленный сервер источника репликации по-прежнему имеет старые реплики, использующие версии MySQL, не поддерживающие несколько триггеров, на этих репликах возникает ошибка, если триггер создается на источнике для таблицы, которая уже содержит триггер с таким же событием триггера и временем действия.

Понижение версии. Если вы понижаете сервер, поддерживающий несколько триггеров, до более старой версии, которая этого не делает, понижение версии оказывает следующие эффекты:

  • Для каждой таблицы, содержащей триггеры, все определения триггеров находятся в файле .TRG для таблицы. Однако, если существуют несколько триггеров с одинаковым событием триггера и временем действия, сервер выполняет только один из них при возникновении события триггера. Справочную информацию о файлах .TRG см. в разделе «Хранение триггеров таблиц» документации MySQL Server Doxygen, доступной по адресу https://dev.mysql.com/doc/index-other.html.

  • Если триггеры для таблицы добавляются или удаляются после понижения версии, сервер перезаписывает файл .TRG таблицы. Перезаписанный файл содержит только один триггер на каждую комбинацию события триггера и времени действия; остальные теряются.

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

  1. Для каждого триггера создайте хранимую процедуру, которая содержит весь код в триггере. Значения, к которым осуществляется доступ с помощью NEW и OLD, могут быть переданы в процедуру с помощью параметров. Если триггеру требуется одно значение результата из кода, вы можете поместить код в хранимую функцию и заставить функцию возвращать значение. Если триггеру требуется несколько значений результата из кода, вы можете поместить код в хранимую процедуру и возвращать значения с помощью параметров OUT.

  2. Удалите все триггеры для таблицы.

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/replication-features-triggers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API