Выполнение триггеров на реплике для событий на основе строк
В репликации исторически использовались термины мастер и слейв, но теперь предпочтительнее термины первичный и реплика. Старые термины всё ещё используются в некоторых частях документации и в командах MariaDB, хотя MariaDB 10.5 начала процесс переименования. Процесс документирования продолжается. Следите за прогрессом на MDEV-18777.
MariaDB может принудительно запустить на потоке реплики триггеры для событий binlog на основе строк.
Настройка контролируется глобальной переменной slave_run_triggers_for_rbr. Её также можно указать в командной строке или в my.cnf.
Возможные значения:
| Значение | Значение |
|---|---|
| NO (По умолчанию) | Не вызывать триггеры для событий на основе строк |
| YES | Вызывать триггеры для событий на основе строк, не записывать их эффект в бинарный лог |
| LOGGING | Вызывать триггеры для событий на основе строк и записывать их эффект в бинарный лог |
| ENFORCE | Только начиная с MariaDB 10.5.2. Триггеры всегда будут запускаться на реплике, даже если на мастере есть триггеры. ENFORCE подразумевает LOGGING. |
Обратите внимание, что если вы просто хотите использовать триггеры вместе с репликацией, вам, скорее всего, не нужна эта опция. Подробности см. ниже.
Когда использовать slave_run_triggers_for_rbr
Обзор
Обычно система репликации MariaDB может автоматически реплицировать действия триггеров.
- При использовании репликации на основе операторов бинарный лог содержит операторы SQL. Сервер(ы) реплики выполняют операторы SQL. Триггеры выполняются на мастере и на каждой реплике независимо.
- При использовании репликации на основе строк бинарный лог содержит изменения строк. Он будет содержать как изменения, сделанные самим оператором, так и изменения, сделанные триггерами, вызванными оператором. Серверу(ам) реплики не нужно запускать триггеры для изменений строк, которые они применяют.
Целевой случай использования
Можно настроить реплику таким образом, чтобы на ней были триггеры, отсутствующие на мастере (предположим, реплике необходимо обновить сводные таблицы или выполнить какой-либо процесс типа ETL).
Если используется репликация на основе операторов, достаточно создать необходимые триггеры на реплике. Реплика выполнит операторы из бинарного лога, что вызовет выполнение триггеров.
Однако, в некоторых случаях необходимо использовать репликацию на основе строк. Это может быть связано с тем, что мастер выполняет недетерминированные операторы, или мастер может быть узлом в кластере Galera. В этом случае вы хотите, чтобы события на основе строк вызывали триггеры на реплике. Для этого и предназначена опция slave_run_triggers_for_rbr. Установка опции в значение YES приведет к вызову SQL-потоком реплики триггеров для событий на основе строк; установка в значение LOGGING также вызовет запись изменений, внесённых триггерами, в бинарный лог.
Вызываются следующие триггеры:
- Update_row_event выполняет триггер UPDATE
- Delete_row_event выполняет триггер DELETE
- Write_row_event выполняет триггер INSERT. Кроме того, он выполняет триггер DELETE, если возникла конфликтная строка, которая должна была быть удалена.
Предотвращение множественного вызова триггеров
Существует базовая защита от вызова триггеров как на мастере, так и на реплике. Если мастер изменяет таблицу, содержащую триггеры, он сгенерирует события binlog на основе строк со флагом «триггеры были вызваны для этого события». Реплика не будет вызывать триггеры для событий с этим флагом.
См. также
- Задача в Jira, MDEV-5095.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/running-triggers-on-the-replica-for-row-based-events/