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 重启)。
此语句的效果不是持久的;使用 CHANGE REPLICATION FILTER 设置的任何过滤器在重启副本 mysqld 后都会丢失。
CHANGE REPLICATION FILTER 需要 REPLICATION_SLAVE_ADMIN 权限(或已弃用的 SUPER 权限)。
使用 FOR 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 过滤器的确切效果取决于是使用基于语句的复制还是基于行的复制。
可以在单个 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 频道子句在复制频道上设置复制过滤器:
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 将为每个配置的复制频道以及全局复制过滤器配置复制过滤器。对于每种过滤类型,如果在语句中列出了过滤类型,则该类型的任何现有过滤规则都将被最近发出的语句中指定的过滤规则所替换,否则将保留过滤类型的旧值。
如果同一过滤规则被指定多次,只有最后一个此类规则实际使用。例如,这里显示的两个语句具有完全相同的效果,因为第一个语句中的第一个 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));
刚刚显示的语句包含两组括号,一组括起数据库名称对,另一组括起整个列表。这在以下示例中可能更容易看到,它创建了两条重写数据库规则,一条将数据库 dbA 重写为 dbB,另一条将数据库 dbC 重写为 dbD:
CHANGE REPLICATION FILTER
REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));
CHANGE REPLICATION FILTER 语句仅替换受语句影响的过滤类型和复制频道的复制过滤规则,保持其他规则和频道不变。如果您想取消设置给定类型的所有