Spec-Zone.ru › MySQL 9.2

15.4.2.1 Оператор CHANGE REPLICATION FILTER

CHANGE REPLICATION FILTER filter[, filter]
	[, ...] [FOR CHANNEL channel]

filter: {
    REPLICATE_DO_DB = (db_list)
  | REPLICATE_IGNORE_DB = (db_list)
  | REPLICATE_DO_TABLE = (tbl_list)
  | REPLICATE_IGNORE_TABLE = (tbl_list)
  | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  | REPLICATE_REWRITE_DB = (db_pair_list)
}

db_list:
    db_name[, db_name][, ...]

tbl_list:
    db_name.table_name[, db_name.table_name][, ...]
wild_tbl_list:
    'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]

db_pair_list:
    (db_pair)[, (db_pair)][, ...]

db_pair:
    from_db, to_db

CHANGE REPLICATION FILTER задаёт одну или несколько правил фильтрации репликации для реплики таким же образом, как запуск реплики mysqld с параметрами фильтрации репликации, такими как --replicate-do-db или --replicate-wild-ignore-table. Фильтры, заданные с помощью этого оператора, отличаются от фильтров, заданных с помощью параметров сервера в двух ключевых аспектах:

  1. Для применения оператора не требуется перезапуск сервера, только что поток репликации SQL должен быть остановлен с использованием STOP REPLICA SQL_THREAD (и после этого перезапущен с использованием START REPLICA SQL_THREAD).

  2. Эффекты оператора не сохраняются; любые фильтры, заданные с помощью CHANGE REPLICATION FILTER, теряются после перезапуска реплики mysqld.

CHANGE REPLICATION FILTER требует привилегии REPLICATION_SLAVE_ADMIN (или устаревшей привилегии SUPER).

Используйте предложение FOR CHANNEL channel, чтобы задать фильтр репликации, специфичный для канала репликации, например, на реплике с несколькими источниками. Фильтры, применяемые без предложения FOR CHANNEL, считаются глобальными фильтрами, то есть применяются ко всем каналам репликации.

Примечание

Глобальные фильтры репликации не могут быть установлены на экземпляре MySQL, настроенном для Group Replication, потому что фильтрация транзакций на некоторых серверах сделает группу неспособной достичь согласия по согласованному состоянию. Специфичные для канала фильтры репликации могут быть установлены на каналах репликации, которые не участвуют непосредственно в Group Replication, например, когда член группы также выступает в роли реплики для источника, находящегося вне группы. Они не могут быть установлены на каналах group_replication_applier или group_replication_recovery.

Следующий список показывает CHANGE REPLICATION FILTER параметры и то, как они относятся к --replicate-* параметрам сервера:

  • REPLICATE_DO_DB: Включать обновления на основе имени базы данных. Эквивалентно --replicate-do-db.

  • REPLICATE_IGNORE_DB: Исключать обновления на основе имени базы данных. Эквивалентно --replicate-ignore-db.

  • REPLICATE_DO_TABLE: Включать обновления на основе имени таблицы. Эквивалентно --replicate-do-table.

  • REPLICATE_IGNORE_TABLE: Исключать обновления на основе имени таблицы. Эквивалентно --replicate-ignore-table.

  • REPLICATE_WILD_DO_TABLE: Включать обновления на основе соответствия имени таблицы шаблону с подстановочными знаками. Эквивалентно --replicate-wild-do-table.

  • REPLICATE_WILD_IGNORE_TABLE: Исключать обновления на основе соответствия имени таблицы шаблону с подстановочными знаками. Эквивалентно --replicate-wild-ignore-table.

  • REPLICATE_REWRITE_DB: Выполнять обновления на реплике после замены нового имени на реплике указанной базы данных на источнике. Эквивалентно --replicate-rewrite-db.

Точный эффект фильтров REPLICATE_DO_DB и REPLICATE_IGNORE_DB зависит от того, используется ли репликация на основе операторов или строк. Подробнее см. Раздел 19.2.5, «Как серверы оценивают правила фильтрации репликации».

Несколько правил фильтрации репликации можно создать в одном операторе CHANGE REPLICATION FILTER, разделив правила запятыми, как показано здесь:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);

Выполнение показанного оператора эквивалентно запуску реплики mysqld с параметрами --replicate-do-db=d1 --replicate-ignore-db=d2.

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

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (d1) FOR CHANNEL channel_1;

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

На реплике с несколькими настроенными каналами репликации, выдача CHANGE REPLICATION FILTER без предложения FOR CHANNEL настраивает фильтр репликации для каждого настроенного канала репликации, а также для глобальных фильтров репликации. Для каждого типа фильтра, если тип фильтра перечислен в операторе, то любые существующие правила фильтрации этого типа заменяются правилами фильтрации, указанными в последнем выданном операторе, в противном случае старое значение типа фильтра сохраняется. Подробнее см. Раздел 19.2.5.4, «Фильтры репликации на основе каналов».

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

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3, db4);
Предупреждение

Это поведение отличается от поведения параметров фильтра --replicate-*, где указание одного и того же параметра несколько раз приводит к созданию нескольких правил фильтрации.

Имена таблиц и баз данных, не содержащие специальных символов, не нуждаются в кавычках. Значения, используемые с REPLICATION_WILD_TABLE и REPLICATION_WILD_IGNORE_TABLE, являются строковыми выражениями, возможно, содержащими (специальные) символы подстановки, и поэтому должны быть заключены в кавычки. Это показано в следующих примерах операторов:

CHANGE REPLICATION FILTER
    REPLICATE_WILD_DO_TABLE = ('db1.old%');

CHANGE REPLICATION FILTER
    REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');

Значения, используемые с REPLICATE_REWRITE_DB, представляют пары имён баз данных; каждое такое значение должно быть заключено в скобки. Следующий оператор переписывает операторы, выполняемые в базе данных db1 на источнике в базу данных db2 на реплике:

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));

Приведённый оператор содержит две пары скобок, одна включает пару имён баз данных, а другая — весь список. Это, пожалуй, легче увидеть в следующем примере, который создаёт два правила rewrite-db, одно переписывает базу данных dbA в dbB, а другое — базу данных dbC в dbD:

CHANGE REPLICATION FILTER
  REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));

Оператор CHANGE REPLICATION FILTER заменяет правила фильтрации репликации только для типов фильтров и каналов репликации, затронутых оператором, и оставляет другие правила и каналы без изменений. Если вы хотите сбросить все фильтры данного типа, установите значение фильтра в явное пустое значение, как показано в этом примере, который удаляет все существующие правила REPLICATE_DO_DB и REPLICATE_IGNORE_DB:

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();

Установка фильтра в пустое значение таким образом удаляет все существующие правила, не создаёт новых и не восстанавливает правила, заданные при запуске mysqld с помощью --replicate-* параметров в командной строке или в файле конфигурации.

Оператор RESET REPLICA ALL удаляет фильтры репликации, специфичные для канала, которые были установлены на каналах, удалённых оператором. При повторном создании удалённого канала или каналов любые глобальные фильтры репликации, указанные для реплики, копируются в них, и никакие специфичные для канала фильтры репликации не применяются.

Дополнительную информацию см. в Разделе 19.2.5, «Как серверы оценивают правила фильтрации репликации».

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

Spec-Zone.ru

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