Documentation Home

13.4.2.2 更改复制过滤器语句

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

  1. 该语句不需要重启服务器即可生效,只需STOP SLAVE SQL_THREAD要先停止使用复制SQL线程(之后再重启 START SLAVE SQL_THREAD)即可。

  2. 语句的效果不是持久的;CHANGE REPLICATION FILTER重启副本 mysqld后,使用的任何过滤器都将丢失。

CHANGE REPLICATION FILTER 需要SUPER特权。

笔记

不能在为组复制配置的 MySQL 服务器实例上设置复制过滤器,因为在某些服务器上过滤事务会使组无法就一致状态达成一致。

以下列表显示了CHANGE REPLICATION FILTER选项以及它们与 --replicate-*服务器选项的关系:

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));

The statement just shown contains two sets of parentheses, one enclosing the pair of database names, and the other enclosing the entire list. This is perhaps more easily seen in the following example, which creates two rewrite-db rules, one rewriting database dbA to dbB, and one rewriting database dbC to dbD:

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

This statement leaves any existing replication filtering rules unchanged; to unset all filters of a given type, set the filter's value to an explicitly empty list, as shown in this example, which removes all existing REPLICATE_DO_DB and REPLICATE_IGNORE_DB rules:

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

以这种方式将过滤器设置为空会删除所有现有规则,不会创建任何新规则,并且不会使用--replicate-* 命令行或配置文件中的选项恢复在 mysqld 启动时设置的任何规则。

REPLICATE_WILD_DO_TABLE 与和一起 使用的值REPLICATE_WILD_IGNORE_TABLE必须采用 . 在 MySQL 5.7.5 之前,这并没有严格执行,尽管对这些选项使用不一致的值可能会导致错误的结果(错误 #18095449)。 db_name.tbl_name

有关详细信息,请参阅第 16.2.5 节,“服务器如何评估复制过滤规则”