19.2.5.3 Взаимодействие между опциями фильтрации репликации
Если вы используете комбинацию опций фильтрации репликации на уровне базы данных и на уровне таблицы, реплика сначала принимает или игнорирует события, используя опции базы данных, а затем оценивает все разрешенные события в соответствии с опциями таблицы. Иногда это может привести к результатам, которые кажутся нелогичными. Также важно отметить, что результаты зависят от того, регистрируется ли операция в формате двоичного протоколирования на основе операторов или строк. Если вы хотите убедиться, что ваши фильтры репликации всегда работают одинаково независимо от формата двоичного протоколирования, что особенно важно, если вы используете смешанный формат двоичного протоколирования, следуйте рекомендациям в этой теме.
Эффект опций фильтрации репликации отличается между форматами двоичного протоколирования из-за способа идентификации имени базы данных. В формате на основе операторов операторы DML обрабатываются на основе текущей базы данных, как указано оператором USE. В формате на основе строк операторы DML обрабатываются на основе базы данных, в которой существует изменённая таблица. Операторы DDL всегда фильтруются на основе текущей базы данных, как указано оператором USE, независимо от формата двоичного протоколирования.
Операция, которая включает несколько таблиц, также может по-разному влиять на опции фильтрации репликации в зависимости от формата двоичного протоколирования. Операции, на которые следует обратить внимание, включают транзакции, включающие операторы UPDATE с несколькими таблицами, триггеры, каскадные внешние ключи, хранимые функции, которые обновляют несколько таблиц, и операторы DML, которые вызывают хранимые функции, обновляющие одну или несколько таблиц. Если эти операции обновляют как отфильтрованные, так и неотфильтрованные таблицы, результаты могут различаться в зависимости от формата двоичного протоколирования.
Если вам нужно гарантировать, что ваши фильтры репликации работают последовательно независимо от формата двоичного протоколирования, особенно если вы используете смешанный формат двоичного протоколирования (binlog_format=MIXED), используйте только опции фильтрации репликации на уровне таблицы и не используйте опции фильтрации репликации на уровне базы данных. Также не используйте операторы DML с несколькими таблицами, которые обновляют как отфильтрованные, так и неотфильтрованные таблицы.
Если вам нужно использовать комбинацию опций фильтрации репликации на уровне базы данных и на уровне таблицы и вы хотите, чтобы они работали как можно более последовательно, выберите одну из следующих стратегий:
Если вы используете формат двоичного протоколирования на основе строк (
binlog_format=ROW), для операторов DDL, полагайтесь на операторUSE, чтобы установить базу данных, и не указывайте имя базы данных. Вы можете рассмотреть возможность перехода к формату двоичного протоколирования на основе строк для повышения согласованности с фильтрацией репликации. См. Раздел 7.4.4.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.