16.2.5 服务器如何评估复制筛选规则

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

在源上,您可以使用--binlog-do-db--binlog-ignore-db选项控制二进制记录,从而控制要记录更改的数据库。有关服务器评估这些选项时使用的规则的说明,请参见第 16.2.5.1 节“数据库级复制和二进制日志记录选项的评估”。您不应使用这些选项来控制要复制的数据库和 table。而是,对副本使用筛选来控制在副本上执行的事件。

在副本方面,根据是从副本开始的--replicate-*选项来决定是否执行还是忽略从源接收到的语句。 (请参阅第 16.1.6 节“复制和二进制日志记录选项和变量”。)也可以使用CHANGE REPLICATION FILTER语句动态设置由这些选项控制的过滤器。无论是在启动时使用--replicate-*选项创建还是在副本服务器由CHANGE REPLICATION FILTER运行时创建这些过滤器的规则都是相同的。请注意,不能在为组复制配置的 MySQL 服务器实例上使用复制过滤器,因为在某些服务器上过滤事务将使该组无法就一致状态达成协议。

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

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

对于仅影响数据库的语句(即CREATE DATABASEDROP DATABASEALTER DATABASE),数据库级选项始终优先于任何--replicate-wild-do-table选项。换句话说,对于此类语句,当且仅当没有适用的数据库级选项时,才会检查--replicate-wild-do-table选项。这是对 MySQL 早期版本的行为更改,在以前的版本中,如果副本是使用--replicate-do-db=dbx --replicate-wild-do-table=db%.t1启动的,则不会复制语句创建数据库 dbx。 (缺陷#46110)

为了更容易确定选项集将产生什么效果,建议您避免混合使用“ do”和“ ignore”选项,或者使用通配符和非通配符。

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

Note

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