如果复制源服务器没有将语句写入其二进制日志,则该语句不会被复制。如果服务器记录了该语句,则该语句将被发送到所有副本,并且每个副本都会确定是否执行该语句或忽略该语句。
在源上,您可以使用 --binlog-do-db
和 --binlog-ignore-db
选项来控制要记录更改的数据库,以控制二进制日志记录。有关服务器在评估这些选项时使用的规则的说明,请参阅 第 19.2.5.1 节,“数据库级复制和二进制日志记录选项的评估”。您不应该使用这些选项来控制要复制的数据库和表。相反,请在副本上使用过滤来控制在副本上执行的事件。
在副本端,关于是否执行或忽略从源接收的语句的决定是根据副本启动时使用的 --replicate-*
选项做出的。(参阅 第 19.1.6 节,“复制和二进制日志记录选项和变量”。)这些选项控制的过滤器也可以使用 CHANGE REPLICATION FILTER
语句动态设置。管理这些过滤器的规则与在启动时使用 --replicate-*
选项创建过滤器或在副本服务器运行时使用 CHANGE REPLICATION FILTER
创建过滤器是相同的。请注意,复制过滤器不能用于在配置为组复制的 MySQL 服务器实例上的组复制特定通道,因为过滤某些服务器上的事务会导致该组无法就一致状态达成一致。
在最简单的情况下,当没有 --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.30 节“复制期间的副本错误”。