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 相同。使用此语句设置的过滤器与使用服务器选项设置的过滤器在两个关键方面有所不同:
该语句不需要重启服务器即可生效,只需要使用
STOP REPLICA SQL_THREAD
首先停止复制 SQL 线程(然后使用START REPLICA SQL_THREAD
重新启动它)。该语句的效果不是持久的;在副本 mysqld 重启后,使用
CHANGE REPLICATION FILTER
设置的任何过滤器都将丢失。
CHANGE REPLICATION FILTER
需要 REPLICATION_SLAVE_ADMIN
权限(或已弃用的 SUPER
权限)。
使用 FOR CHANNEL
子句可以针对复制通道(例如,在多源副本上)创建特定的复制过滤器。没有指定 channel
FOR CHANNEL
子句的过滤器被视为全局过滤器,这意味着它们应用于所有复制通道。
无法在配置为组复制的 MySQL 服务器实例上设置全局复制过滤器,因为在某些服务器上过滤事务会导致组无法就一致状态达成一致。可以在不直接参与组复制的复制通道上设置通道特定的复制过滤器,例如组成员还充当组外部源的副本时。不能在 group_replication_applier
或 group_replication_recovery
通道上设置它们。
下列表格显示了 CHANGE REPLICATION FILTER
选项以及它们与 --replicate-*
服务器选项的关系
REPLICATE_DO_DB
:根据数据库名称包含更新。等效于--replicate-do-db
。REPLICATE_IGNORE_DB
:根据数据库名称排除更新。等效于--replicate-ignore-db
。REPLICATE_DO_TABLE
:根据表名包含更新。等效于--replicate-do-table
。REPLICATE_IGNORE_TABLE
:根据表名排除更新。等效于--replicate-ignore-table
。REPLICATE_WILD_DO_TABLE
:根据通配符模式匹配表名包含更新。等效于--replicate-wild-do-table
。REPLICATE_WILD_IGNORE_TABLE
:根据通配符模式匹配表名排除更新。等效于--replicate-wild-ignore-table
。REPLICATE_REWRITE_DB
:在将副本上的新名称替换为源上指定的数据库后,对副本执行更新。等效于--replicate-rewrite-db
。
REPLICATE_DO_DB
和 REPLICATE_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-*
过滤器选项的行为不同,在后者中,多次指定同一选项会导致创建多个过滤规则。
不包含任何特殊字符的表名和数据库名不需要用引号引起来。与 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
规则,一个将数据库 dbA
重写为 dbB
,另一个将数据库 dbC
重写为 dbD
CHANGE REPLICATION FILTER
REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));
CHANGE REPLICATION FILTER
语句仅替换受该语句影响的过滤器类型和复制通道的复制过滤规则,并保留其他规则和通道不变。如果要取消设置给定类型的所有过滤器,请将过滤器的值设置为显式空列表,如下例所示,该示例删除了所有现有的 REPLICATE_DO_DB
和 REPLICATE_IGNORE_DB
规则
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
以这种方式将过滤器设置为空将删除所有现有规则,不会创建任何新规则,也不会恢复在 mysqld 启动时使用命令行或配置文件中的 --replicate-*
选项设置的任何规则。
RESET REPLICA ALL
语句删除在该语句删除的通道上设置的通道特定复制过滤器。重新创建已删除的通道时,将复制为副本指定的任何全局复制过滤器,并且不应用任何通道特定的复制过滤器。
有关更多信息,请参见 第 19.2.5 节“服务器如何评估复制过滤规则”。