Documentation Home

13.4.2.2 更改复制过滤器语句

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. 该语句不需要重启服务器即可生效,只需STOP REPLICA SQL_THREAD要先停止使用复制SQL线程(之后再重启 START REPLICA SQL_THREAD)即可。

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

CHANGE REPLICATION FILTER 需要 REPLICATION_SLAVE_ADMIN特权(或已弃用的SUPER 特权)。

使用该子句使复制过滤器特定于复制通道,例如在多源副本上。在没有特定子句的情况下应用的过滤器被视为全局过滤器,这意味着它们适用于所有复制通道。 FOR CHANNEL channelFOR CHANNEL

笔记

不能在为组复制配置的 MySQL 服务器实例上设置全局复制过滤器,因为在某些服务器上过滤事务会使组无法就一致状态达成一致。可以在不直接与组复制相关的复制通道上设置特定于通道的复制过滤器,例如组成员也充当组外源的副本。它们不能在group_replication_appliergroup_replication_recovery通道上设置。

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

REPLICATE_DO_DB和 过滤器 的确切效果REPLICATE_IGNORE_DB取决于是基于语句还是基于行的复制生效。有关详细信息,请参阅第 17.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子句的发布为每个配置的复制通道和全局复制过滤器配置复制过滤器。对于每个过滤器类型,如果过滤器类型在语句中列出,则该类型的任何现有过滤器规则将替换为最近发布的语句中指定的过滤器规则,否则过滤器类型的旧值将被保留。有关详细信息,请参阅第 17.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规则,一条将数据库重写 dbAdbB,另一条将数据库重写dbCdbD

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

CHANGE REPLICATION FILTER 语句仅针对受该语句影响的过滤器类型和复制通道替换复制过滤规则,其他规则和通道保持不变。如果要取消设置给定类型的所有过滤器,请将过滤器的值设置为一个明确的空列表,如本例所示,这将删除所有现有的REPLICATE_DO_DBREPLICATE_IGNORE_DB规则:

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

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

RESET REPLICA ALL语句删除在该语句删除的通道上设置的特定于通道的复制过滤器。重新创建已删除的一个或多个通道时,为副本指定的任何全局复制过滤器都会复制到它们,并且不会应用任何通道特定的复制过滤器。

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