MySQL 8.0 参考手册  / 第十七章复制  / 17.2 复制实现  /  17.2.5 服务器如何评估复制过滤规则

17.2.5 服务器如何评估复制过滤规则

如果复制源服务器没有将语句写入其二进制日志,则不会复制该语句。如果服务器确实记录了该语句,则将该语句发送到所有副本,每个副本决定是执行它还是忽略它。

在源上,您可以通过使用--binlog-do-db--binlog-ignore-db选项来控制二进制日志记录来控制记录更改的数据库。有关服务器在评估这些选项时使用的规则的描述,请参阅 第 17.2.5.1 节,“数据库级复制和二进制日志记录选项的评估”。您不应使用这些选项来控制复制哪些数据库和表。相反,在副本上使用过滤来控制在副本上执行的事件。

在副本端,关于是执行还是忽略从源接收到的语句的决定是根据 --replicate-*副本启动时使用的选项做出的。(请参阅第 17.1.6 节,“复制和二进制日志记录选项和变量”。)由这些选项管理的过滤器也可以使用CHANGE REPLICATION FILTER语句动态设置。管理此类过滤器的规则是相同的,无论它们是在启动时使用--replicate-*选项创建的,还是在副本服务器运行时创建的CHANGE REPLICATION FILTER. 请注意,复制过滤器不能用于为组复制配置的 MySQL 服务器实例上的组复制特定通道,因为在某些服务器上过滤事务会使组无法就一致状态达成一致。

在最简单的情况下,当没有 --replicate-*选项时,副本执行它从源接收到的所有语句。否则,结果取决于给定的特定选项。

首先检查数据库级选项(--replicate-do-db, --replicate-ignore-db);有关此过程的描述,请参阅第 17.2.5.1 节,“数据库级复制和二进制日志记录选项的评估” 。如果没有使用数据库级选项,选项检查将继续到可能正在使用的任何表级选项(有关这些的讨论,请参阅第 17.2.5.2 节,“表级复制选项的评估”)。如果使用了一个或多个数据库级选项但没有一个匹配,则不会复制该语句。

对于仅影响数据库的语句(即 CREATE DATABASEDROP DATABASEALTER DATABASE),数据库级选项始终优先于任何 --replicate-wild-do-table选项。换句话说,对于此类语句, --replicate-wild-do-table当且仅当没有适用的数据库级选项时才会检查选项。

为了更容易确定给定选项集的效果,建议您避免混合使用do-*ignore-*选项,或者包含通配符的选项和不包含通配符的选项。

如果--replicate-rewrite-db 指定了任何选项,则在 --replicate-*测试过滤规则之前应用它们。

笔记

所有复制过滤选项都遵循相同的区分大小写规则,这些规则适用于 MySQL 服务器中其他地方的数据库和表的名称,包括 lower_case_table_names系统变量的影响。

从 MySQL 8.0.31 开始,在执行任何权限检查之前应用过滤规则;如果过滤掉一个事务,则不会对该事务执行权限检查,因此不会引发错误。有关详细信息,请参阅 第 17.5.1.29 节,“复制期间的副本错误”