暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 -复制语句(5)- 控制副本服务器的 SQL 语句- CHANGE REPLICATION FILTER

林员外聊编程 2020-11-08
245
CHANGE REPLICATION FILTER 语句
 
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 | SLAVE SQL_THREAD 停止复制 SQL 线程(然后使用 START REPLICA | SLAVE SQL_THREAD 重新启动)。CHANGE REPLICATION FILTER 语句需要 REPLICATION_SLAVE_ADMIN 权限(或不推荐使用的 SUPER 权限)。使用 FOR CHANNEL channel 子句给复制筛选器指定复制通道,例如在多源副本上。不应用 FOR CHANNEL 子句的筛选器被视为全局筛选器,这意味着它们将应用于所有复制通道。
 
下面的列表展示了 CHANGE REPLICATION FILTER 选项以及它们与 --replicate-* 服务器选项的关联:
 
● REPLICATE_DO_DB: 包括基于数据库名称的更新。相当于 --replicate-do-db
 
● REPLICATE_IGNORE_DB: 根据数据库名称排除更新。相当于 --replicate-ignore-db
 
● REPLICATE_DO_TABLE: 包括基于表名的更新。相当于 --replicate-do-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 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 子句为每个配置的复制通道和全局复制筛选器配置复制筛选器。对于每个筛选器类型,如果类型列在语句中,则该类型的任何现有筛选器规则都将替换为最近执行的语句中指定的筛选器规则,否则将保留筛选器类型的旧值。
 
如果同一过滤规则被多次指定,实际上只使用最后一个。例如,这里显示的两条语句具有完全相同的效果,因为第一条语句中的第一个 REPLICATE_DO_DB 规则被忽略:
 
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);


CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (db3, db4);
复制
 
不包含任何特殊字符的表和数据库的名称不需要使用引号。用于 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 = ();
复制
 
以这种方式将筛选器设置为空将删除所有现有规则,不会创建任何新规则,也不会恢复在 mysqld 启动时在命令行使用 --replicate-* 选项或配置文件设置的任何规则。
 
RESET REPLICA | SLAVE ALL 语句删除特定于通道的复制筛选器,这些筛选器设置在语句删除的通道上。当重新创建已删除的通道时,副本指定的任何全局复制筛选器都将复制到这些通道,但不会应用特定于通道的复制筛选器。
 
 
 
 
 
官方网址:
https://dev.mysql.com/doc/refman/8.0/en/change-replication-filter.html

文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论