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
。使用该语句设置的过滤器与使用服务器选项不同之处在于:
-
语句不需要重启服务器,只需停止复制SQL线程使用
STOP REPLICA SQL_THREAD
后,然后重新启动使用START REPLICA SQL_THREAD
。 -
语句的效果不持久;使用
CHANGE REPLICATION FILTER
设置的过滤器在副本mysqld重启后将丢失。
CHANGE REPLICATION FILTER
需要REPLICATION_SLAVE_ADMIN
特权(或弃用的SUPER
特权).
使用 FOR CHANNEL
子句,使得复制过滤器专门用于某个复制通道,例如在多源副本中。没有指定 channel
FOR CHANNEL
子句的过滤器被认为是全局过滤器,意味着它们将应用于所有复制通道。
全球复制过滤器不能在配置了 Group Replication 的 MySQL 服务器实例上设置,因为在某些服务器上 filtering 事务将使得组无法达成一致状态。通道特定的复制过滤器可以在不直接参与 Group Replication 的复制通道上设置,例如一个组成员也作为外部源的副本。但不能设置在 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);
执行上述语句等同于使用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);
这个行为与使用--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 = ();
以这种方式设置过滤器将删除所有现有规则,不创建新的规则,也不恢复使用命令行或配置文件中的 --replicate-*
选项设置的规则。
RESET REPLICA ALL
语句删除语句中删除的通道特定的复制过滤器。删除通道或通道重新创建时, replica 上指定的全局过滤器将被复制到它们,并不应用通道特定的过滤器。
更多信息,请参见第19.2.5节,“服务器评估复制过滤规则”。