Spec-Zone.ru › MySQL 9.2

19.2.5.3 Взаимодействие между опциями фильтрации репликации

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

Эффект опций фильтрации репликации отличается в зависимости от форматов двоичного логгирования из-за способа идентификации имени базы данных. В формате на основе операторов операторы DML обрабатываются на основе текущей базы данных, как указано оператором USE. В формате на основе строк операторы DML обрабатываются на основе базы данных, в которой существует изменённая таблица. Операторы DDL всегда фильтруются на основе текущей базы данных, как указано оператором USE, независимо от формата двоичного логгирования.

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

Если вам нужно гарантировать, что ваши фильтры репликации работают последовательно независимо от формата двоичного логгирования, особенно если вы используете смешанный формат двоичного логгирования (binlog_format=MIXED), используйте только опции фильтрации репликации на уровне таблицы и не используйте опции фильтрации репликации на уровне базы данных. Кроме того, не используйте операторы DML для нескольких таблиц, которые обновляют как отфильтрованные, так и исключённые таблицы.

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

  1. Если вы используете формат двоичного логгирования на основе строк (binlog_format=ROW), для операторов DDL полагайтесь на оператор USE для установки базы данных и не указывайте имя базы данных. Вы можете рассмотреть возможность перехода к формату двоичного логгирования на основе строк для повышения согласованности с фильтрацией репликации. См. Раздел 7.4.4.2, «Установка формата двоичного лога» для условий, применяемых при изменении формата двоичного логгирования.

  2. Если вы используете формат двоичного логгирования на основе операторов или смешанный формат двоичного логгирования (binlog_format=STATEMENT или MIXED), для операторов DML и DDL полагайтесь на оператор USE и не используйте имя базы данных. Кроме того, не используйте операторы DML для нескольких таблиц, которые обновляют как отфильтрованные, так и исключённые таблицы.

Пример 19.7 Опция --replicate-ignore-db и опция --replicate-do-table

На сервере источника репликации выполняются следующие операторы:

USE db1;
CREATE TABLE t2 LIKE t1;
INSERT INTO db2.t3 VALUES (1);

На реплике установлены следующие опции фильтрации репликации:

replicate-ignore-db = db1
replicate-do-table = db2.t3

Оператор DDL CREATE TABLE создаёт таблицу в db1, как указано предыдущим оператором USE. Реплика отфильтровывает этот оператор в соответствии с опцией --replicate-ignore-db = db1, поскольку db1 является текущей базой данных. Этот результат одинаков независимо от формата двоичного логгирования на сервере источника репликации. Однако результат оператора DML INSERT отличается в зависимости от формата двоичного логгирования:

  • Если на источнике используется формат двоичного логгирования на основе строк (binlog_format=ROW), реплика оценивает операцию INSERT используя базу данных, в которой существует таблица, которая называется db2. Поэтому опция уровня базы данных --replicate-ignore-db = db1, которая оценивается первой, не применяется. Опция уровня таблицы --replicate-do-table = db2.t3 применяется, поэтому реплика применяет изменение к таблице t3.

  • Если на источнике используется формат двоичного логгирования на основе операторов (binlog_format=STATEMENT), реплика оценивает операцию INSERT используя базу данных по умолчанию, которая была установлена оператором USE на db1 и не была изменена. Согласно его опции уровня базы данных --replicate-ignore-db = db1, поэтому она игнорирует операцию и не применяет изменение к таблице t3. Опция уровня таблицы --replicate-do-table = db2.t3 не проверяется, потому что оператор уже соответствовал опции уровня базы данных и был проигнорирован.

Если опция --replicate-ignore-db = db1 на реплике необходима, а использование формата двоичного логгирования на основе операторов (или смешанного) на источнике также необходимо, результаты можно сделать согласованными, опуская имя базы данных из оператора INSERT и используя оператор USE вместо него, как показано ниже:

USE db1;
CREATE TABLE t2 LIKE t1;
USE db2;
INSERT INTO t3 VALUES (1);

В этом случае реплика всегда оценивает оператор INSERT на основе базы данных db2. Независимо от того, регистрируется ли операция в формате двоичного логгирования на основе операторов или на основе строк, результаты остаются неизменными.


© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/replication-rules-examples.html

Spec-Zone.ru

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