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
更改复制过滤器
在副本上设置一个或多个复制过滤规则,类似于使用复制过滤选项启动副本 mysqld,例如 --replicate-do-db
或 --replicate-wild-ignore-table
。使用该语句设置的过滤器与使用服务器选项设置的过滤器有两个关键区别:
-
该语句不需要重新启动服务器即可生效,只需要停止复制 SQL 线程使用
STOP REPLICA SQL_THREAD
,然后使用START REPLICA SQL_THREAD
重新启动。 -
该语句的效果不是持久的;使用
更改复制过滤器
设置的任何过滤器都将在副本 mysqld 重新启动后丢失。
更改复制过滤器
需要 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);
发出上述语句相当于使用以下选项启动副本 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 错误。如果对组复制通道发出语句,将出现 ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED 错误。
在具有多个复制通道配置的副本上,发出 CHANGE REPLICATION FILTER
语句,而不带 FOR CHANNEL
子句,将配置每个配置的复制通道的复制过滤器,以及全局复制过滤器。对于每种过滤器类型,如果该类型在语句中列出,则任何现有的该类型的过滤器规则将被语句中指定的过滤器规则所取代,否则将保留旧值。有关更多信息,请参阅 第 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));
更改复制过滤器
语句仅替换受语句影响的复制过滤器规则和通道,而不更改其他规则和通道。如果您想取消某种类型的所有过滤器,请将过滤器的值设置为空列表,如下示例所示,该示例删除了所有现有的 REPLICATE_DO_DB
和 REPLICATE_IGNORE_DB
规则:
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
以这种方式将过滤器设置为空将删除所有现有的规则,不会创建新的规则,也不会恢复使用 --replicate-*
选项在命令行或配置文件中设置的规则。
重置 REPLICA ALL
语句删除了由语句删除的通道的特定复制过滤器。当删除的通道或通道重新创建时,任何全局复制过滤器规则将被复制到它们,而不应用特定通道的复制过滤器。
有关更多信息,请参阅 第 19.2.5 节,“服务器如何评估复制过滤器规则”。