13.4.2.2 Заявление CHANGE REPLICATION FILTER
CHANGE REPLICATION FILTER filter[, filter][, ...]
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_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. Фильтры, установленные с помощью этого оператора, отличаются от фильтров, установленных с помощью параметров сервера в двух ключевых аспектах:
Для вступления в силу оператора не требуется перезапуск сервера, требуется только, чтобы поток SQL репликации был остановлен с помощью
STOP SLAVE SQL_THREADв первую очередь (и перезапущен с помощьюSTART SLAVE SQL_THREADпосле этого).Эффекты оператора не сохраняются; любые фильтры, установленные с помощью
CHANGE REPLICATION FILTER, теряются после перезапуска реплики mysqld.
CHANGE REPLICATION FILTER требует привилегии SUPER.
Фильтры репликации не могут быть установлены на экземпляре MySQL-сервера, настроенном для Group Replication, поскольку фильтрация транзакций на некоторых серверах сделает группу неспособной достичь соглашения об согласованном состоянии.
Следующий список показывает 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 фильтров зависят от того, включена ли репликация на основе операторов или на основе строк. Дополнительную информацию см. в разделе 16.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.
Если одно и то же правило фильтрации указано несколько раз, используется только последнее такое правило. Например, два приведенных здесь оператора имеют совершенно одинаковый эффект, потому что первое 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));
Этот оператор оставляет любые существующие правила фильтрации репликации неизменными; для сброса всех фильтров определенного типа установите значение фильтра в явном виде пустым списком, как показано в этом примере, который удаляет все существующие REPLICATE_DO_DB и REPLICATE_IGNORE_DB правила:
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
Установка фильтра в пустое значение таким образом удаляет все существующие правила, не создает новых и не восстанавливает никакие правила, установленные при запуске mysqld с помощью --replicate-* параметров в командной строке или в файле конфигурации.
Значения, используемые с REPLICATE_WILD_DO_TABLE и REPLICATE_WILD_IGNORE_TABLE, должны быть в формате . До MySQL 5.7.5 это не было строго выполнено, хотя использование несовместимых значений с этими параметрами может привести к ошибочным результатам (Ошибка #18095449). db_name.tbl_name
Дополнительную информацию см. в разделе 16.2.5, «Как серверы оценивают правила фильтрации репликации».
© 2025 Oracle
Licensed under the GPLv2 License.