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以与使用诸如--replicate-do-db--replicate-wild-ignore-table之类的复制过滤选项启动副本mysqld相同的方式在副本上设置一个或多个复制过滤规则。与使用服务器选项的情况不同,此语句不需要重新启动服务器即可生效,只需要先使用停止从 SQL_THREAD停止复制 SQL 线程(然后使用开始从 SQL_THREAD重新启动)即可。 更改复制过滤器需要SUPER特权。

Note

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

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

REPLICATE_DO_DBREPLICATE_IGNORE_DB过滤器的确切效果取决于是基于语句的复制还是基于行的复制。有关更多信息,请参见第 16.2.5 节“服务器如何评估复制过滤规则”

可以通过用逗号分隔规则在单个CHANGE REPLICATION FILTER语句中创建多个复制过滤规则,如下所示:

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

发出刚刚显示的语句等效于使用选项--replicate-do-db=d1 --replicate-ignore-db=d2启动副本mysqld

如果多次指定相同的过滤规则,则实际上仅使用* last *这样的规则。例如,此处显示的两个语句具有完全相同的效果,因为忽略了第一条语句中的第一条REPLICATE_DO_DB规则:

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

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3,db4);

Caution

此行为与--replicate-*过滤器选项的行为不同,后者多次指定同一选项会导致创建多个过滤器规则。

table 和数据库的名称不包含任何特殊字符,无需引用。与REPLICATION_WILD_TABLEREPLICATION_WILD_IGNORE_TABLE一起使用的值是字符串 table 达式,可能包含(特殊)通配符,因此必须加引号。在以下示例语句中显示了这一点:

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

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

REPLICATE_REWRITE_DB一起使用的值 table 示数据库名称的“对”;每个此类值都必须用括号括起来。以下语句将在源数据库db1上发生的语句重写为副本数据库db2上的语句:

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

刚刚显示的语句包含两组括号,一组包含一对数据库名称,另一组包含整个列 table。在下面的示例中可能会更容易看出这一点,该示例创建两个rewrite-db规则,一个将数据库dbA重写为dbB,另一个将数据库dbC重写为dbD

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

该语句使所有现有的复制过滤规则保持不变;要取消设置给定类型的所有过滤器,请将该过滤器的值设置为一个明确为空的列 table,如本示例所示,该列 table 将删除所有现有的REPLICATE_DO_DBREPLICATE_IGNORE_DB规则:

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

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

REPLICATE_WILD_DO_TABLEREPLICATE_WILD_IGNORE_TABLE所采用的值的格式必须为db_name.tbl_name。在 MySQL 5.7.5 之前,这不是严格执行的,尽管在这些选项中使用不一致的值可能会导致错误的结果(错误#18095449)。

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