19.2.5 如何服务器评估复制过滤规则
如果复制源服务器不将语句写入其二进制日志,那么语句将不会被复制。如果服务器确实记录了语句,那么语句将被发送到所有副本,每个副本都将决定是否执行或忽略该语句。
在源服务器上,您可以使用 --binlog-do-db
和 --binlog-ignore-db
选项来控制二进制日志。要了解服务器在评估这些选项时使用的规则,请参阅 第19.2.5.1节,“数据库级别复制和二进制日志选项的评估”。您不应该使用这些选项来控制哪些数据库和表被复制,而是使用副本上的过滤器来控制执行的事件。
在副本端,关于是否执行或忽略来自源服务器的语句的决定是根据副本启动时使用的 --replicate-*
选项进行的。 (请参阅 第19.1.6节,“复制和二进制日志选项和变量”。)这些选项可以使用 CHANGE REPLICATION FILTER
语句进行动态设置。这些规则是否在启动时使用 --replicate-*
选项或在副本服务器运行时使用 CHANGE REPLICATION FILTER
都是一样的。请注意,复制过滤器不能在 Group Replication特定的通道上使用,因为在某些服务器上过滤事务将使得组无法达成一致的状态。
在最简单的情况下,如果没有 --replicate-*
选项,副本将执行所有从源服务器接收到的语句。否则,结果将取决于特定的选项。
数据库级别选项(--replicate-do-db
,--replicate-ignore-db
)首先被检查;见第19.2.5.1节,“数据库级别复制和二进制日志选项评估”,了解该过程。如果没有使用数据库级别选项,选项检查将继续到可能使用的表级别选项(见第19.2.5.2节,“表级别复制选项评估”,了解这些)。如果使用了一个或多个数据库级别选项,但没有匹配的选项,则语句不被复制。
对于只影响数据库的语句(即CREATE DATABASE
,DROP DATABASE
,和ALTER DATABASE
),数据库级别选项总是优先于任何--replicate-wild-do-table
选项。在其他字样,--replicate-wild-do-table
选项将被检查,如果且仅当没有数据库级别选项应用于该语句。
为了更好地确定给定的选项集的效果,我们建议您避免混合do-*
和ignore-*
选项,或者包含通配符的选项与不包含通配符的选项。
如果指定了--replicate-rewrite-db
选项,则它们将在--replicate-*
过滤规则之前被应用。
所有复制过滤选项都遵循MySQL服务器中名称的大小写敏感规则,包括lower_case_table_names
系统变量的影响。
过滤规则在执行任何权限检查之前被应用;如果事务被过滤,则不执行该事务的权限检查,因此不可能出现错误。见第19.5.1.29节,“复制错误”,了解更多信息。