Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.4.2.1 更改复制过滤器语句

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. 语句不需要重启服务器,只需停止复制SQL线程使用STOP REPLICA SQL_THREAD后,然后重新启动使用START REPLICA SQL_THREAD

  2. 语句的效果不持久;使用CHANGE REPLICATION FILTER设置的过滤器在副本mysqld重启后将丢失。

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

使用 FOR CHANNEL channel 子句,使得复制过滤器专门用于某个复制通道,例如在多源副本中。没有指定 FOR CHANNEL 子句的过滤器被认为是全局过滤器,意味着它们将应用于所有复制通道。

Note

全球复制过滤器不能在配置了 Group Replication 的 MySQL 服务器实例上设置,因为在某些服务器上 filtering 事务将使得组无法达成一致状态。通道特定的复制过滤器可以在不直接参与 Group Replication 的复制通道上设置,例如一个组成员也作为外部源的副本。但不能设置在 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);

执行上述语句等同于使用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子句配置所有配置的复制通道和全局复制过滤器。对于每种过滤类型,如果语句中列出了该过滤类型,那么任何现有该类型的过滤规则都将被指定的过滤规则替代,否则保留旧值。更多信息请见第19.2.5.4节,“Replication Channel Based Filters”

如果指定了相同的过滤规则,实际使用的是最后一个这样的规则。例如,这两个语句显示的效果完全一样,因为第一个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-*过滤选项不同,指定同一个选项多次将创建多个过滤规则。

不包含特殊字符的表名和数据库名称不需要引号。用于REPLICATION_WILD_TABLEREPLICATION_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-* 选项设置的规则。

RESET REPLICA ALL 语句删除语句中删除的通道特定的复制过滤器。删除通道或通道重新创建时, replica 上指定的全局过滤器将被复制到它们,并不应用通道特定的过滤器。

更多信息,请参见第19.2.5节,“服务器评估复制过滤规则”