文档首页
MySQL 9.0 参考手册
相关文档 下载本手册

MySQL 9.0 参考手册  /  ...  /  CHANGE REPLICATION FILTER 语句

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 在副本上设置一个或多个复制过滤规则,其方式与使用复制过滤选项(如 --replicate-do-db--replicate-wild-ignore-table)启动副本 mysqld 相同。使用此语句设置的过滤器在两个关键方面不同于使用服务器选项设置的过滤器

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

  2. 该语句的效果并非永久性的;使用 CHANGE REPLICATION FILTER 设置的任何过滤器在重新启动副本 mysqld 后都会丢失。

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

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

注意

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

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

REPLICATE_DO_DBREPLICATE_IGNORE_DB 过滤器的确切效果取决于语句级复制还是基于行的复制生效。有关更多信息,请参阅 第 19.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

在使用多个复制通道从不同源处理事务的多源副本上,使用 FOR CHANNEL channel 子句在复制通道上设置复制过滤器

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

这使您可以创建特定于通道的复制过滤器,以过滤掉来自源的选定数据。当提供 FOR CHANNEL 子句时,复制过滤器语句将作用于该复制通道,删除任何与指定复制过滤器具有相同过滤器类型但已存在的复制过滤器,并用指定过滤器替换它们。语句中未明确列出的过滤器类型不会修改。如果针对未配置的复制通道发出,该语句将失败并出现 ER_SLAVE_CONFIGURATION 错误。如果针对组复制通道发出,该语句将失败并出现 ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED 错误。

在配置了多个复制通道的副本上,发出不带 FOR CHANNEL 子句的 CHANGE REPLICATION FILTER 会为每个已配置的复制通道以及全局复制过滤器配置复制过滤器。对于每种过滤器类型,如果过滤器类型在语句中列出,则任何现有该类型的过滤器规则将被最近发出的语句中指定的过滤器规则替换,否则将保留该过滤器类型的旧值。有关更多信息,请参阅 第 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-* 过滤器选项的行为,在该选项中,多次指定相同的选项会导致创建多个过滤器规则。

不包含任何特殊字符的表和数据库的名称无需加引号。与 REPLICATE_WILD_TABLEREPLICATE_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_DBREPLICATE_IGNORE_DB 规则

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

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

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

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