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
以与使用复制过滤选项(例如
或
)启动副本mysqld相同的方式在副本上设置一个或多个复制过滤规则。使用此语句设置的过滤器在两个关键方面不同于使用服务器选项设置的过滤器:
--replicate-do-db
--replicate-wild-ignore-table
该语句不需要重启服务器即可生效,只需
STOP SLAVE SQL_THREAD
要先停止使用复制SQL线程(之后再重启START SLAVE SQL_THREAD
)即可。语句的效果不是持久的;
CHANGE REPLICATION FILTER
重启副本 mysqld后,使用的任何过滤器都将丢失。
CHANGE REPLICATION FILTER
需要SUPER
特权。
不能在为组复制配置的 MySQL 服务器实例上设置复制过滤器,因为在某些服务器上过滤事务会使组无法就一致状态达成一致。
以下列表显示了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
取决于是基于语句还是基于行的复制生效。有关详细信息,请参阅第 16.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
如果多次指定相同的过滤规则,
则实际上只使用最后一条这样的规则。例如,此处显示的两条语句具有完全相同的效果,因为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));
The statement just shown contains two sets of parentheses, one
enclosing the pair of database names, and the other enclosing
the entire list. This is perhaps more easily seen in the
following example, which creates two
rewrite-db
rules, one rewriting database
dbA
to dbB
, and one
rewriting database dbC
to
dbD
:
CHANGE REPLICATION FILTER
REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));
This statement leaves any existing replication filtering rules
unchanged; to unset all filters of a given type, set the
filter's value to an explicitly empty list, as shown in
this example, which removes all existing
REPLICATE_DO_DB
and
REPLICATE_IGNORE_DB
rules:
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
以这种方式将过滤器设置为空会删除所有现有规则,不会创建任何新规则,并且不会使用--replicate-*
命令行或配置文件中的选项恢复在 mysqld 启动时设置的任何规则。
REPLICATE_WILD_DO_TABLE
与和一起
使用的值REPLICATE_WILD_IGNORE_TABLE
必须采用
. 在 MySQL 5.7.5 之前,这并没有严格执行,尽管对这些选项使用不一致的值可能会导致错误的结果(错误 #18095449)。
db_name
.tbl_name
有关详细信息,请参阅第 16.2.5 节,“服务器如何评估复制过滤规则”。