Spec-Zone.ru › MySQL 5.7

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

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

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

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

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

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

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

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

Пример 16.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-5.7-en/replication-rules-examples.html

Spec-Zone.ru

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