13.4.2.2 CHANGE REPLICATION FILTER 语句
CHANGE REPLICATION FILTER filter[, filter][, ...]
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_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相同的方式在副本上设置一个或多个复制过滤规则。与使用服务器选项的情况不同,此语句不需要重新启动服务器即可生效,只需要先使用停止从 SQL_THREAD停止复制 SQL 线程(然后使用开始从 SQL_THREAD重新启动)即可。 更改复制过滤器需要SUPER特权。
Note
无法在为组复制配置的 MySQL 服务器实例上设置复制过滤器,因为在某些服务器上过滤事务将使该组无法就一致状态达成协议。
以下列 table 显示了CHANGE REPLICATION FILTER
选项以及它们与--replicate-*
服务器选项的关系:
-
REPLICATE_DO_DB
:包括基于数据库名称的更新。等效于--replicate-do-db。 -
REPLICATE_IGNORE_DB
:排除基于数据库名称的更新。等效于--replicate-ignore-db。 -
REPLICATE_DO_TABLE
:包括基于 table 名的更新。等效于--replicate-do-table。 -
REPLICATE_IGNORE_TABLE
:排除基于 table 名的更新。等效于--replicate-ignore-table。 -
REPLICATE_WILD_DO_TABLE
:包括基于通配符模式匹配 table 名称的更新。等效于--replicate-wild-do-table。 -
REPLICATE_WILD_IGNORE_TABLE
:排除基于通配符模式匹配 table 名称的更新。等效于--replicate-wild-ignore-table。 -
REPLICATE_REWRITE_DB
:将副本上的新名称替换为源上的指定数据库后,对副本进行更新。等效于--replicate-rewrite-db。
REPLICATE_DO_DB
和REPLICATE_IGNORE_DB
过滤器的确切效果取决于是基于语句的复制还是基于行的复制。有关更多信息,请参见第 16.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。
如果多次指定相同的过滤规则,则实际上仅使用* last *这样的规则。例如,此处显示的两个语句具有完全相同的效果,因为忽略了第一条语句中的第一条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-*
过滤器选项的行为不同,后者多次指定同一选项会导致创建多个过滤器规则。
table 和数据库的名称不包含任何特殊字符,无需引用。与REPLICATION_WILD_TABLE
和REPLICATION_WILD_IGNORE_TABLE
一起使用的值是字符串 table 达式,可能包含(特殊)通配符,因此必须加引号。在以下示例语句中显示了这一点:
CHANGE REPLICATION FILTER
REPLICATE_WILD_DO_TABLE = ('db1.old%');
CHANGE REPLICATION FILTER
REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');
与REPLICATE_REWRITE_DB
一起使用的值 table 示数据库名称的“对”;每个此类值都必须用括号括起来。以下语句将在源数据库db1
上发生的语句重写为副本数据库db2
上的语句:
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));
刚刚显示的语句包含两组括号,一组包含一对数据库名称,另一组包含整个列 table。在下面的示例中可能会更容易看出这一点,该示例创建两个rewrite-db
规则,一个将数据库dbA
重写为dbB
,另一个将数据库dbC
重写为dbD
:
CHANGE REPLICATION FILTER
REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));
该语句使所有现有的复制过滤规则保持不变;要取消设置给定类型的所有过滤器,请将该过滤器的值设置为一个明确为空的列 table,如本示例所示,该列 table 将删除所有现有的REPLICATE_DO_DB
和REPLICATE_IGNORE_DB
规则:
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
以这种方式将过滤器设置为空会删除所有现有规则,不会创建任何新规则,也不会还原在 mysqld 启动时使用命令行或配置文件中的--replicate-*
选项设置的任何规则。
REPLICATE_WILD_DO_TABLE
和REPLICATE_WILD_IGNORE_TABLE
所采用的值的格式必须为db_name.tbl_name
。在 MySQL 5.7.5 之前,这不是严格执行的,尽管在这些选项中使用不一致的值可能会导致错误的结果(错误#18095449)。
有关更多信息,请参见第 16.2.5 节“服务器如何评估复制过滤规则”。