如果复制源服务器不将语句写入其二进制日志,则语句不会被复制。如果服务器记录了语句,则语句将被发送到所有副本,每个副本将确定是否执行或忽略它。
在源服务器上,您可以使用 --binlog-do-db
和 --binlog-ignore-db
选项来控制二进制日志记录。有关这些选项的评估规则的描述,请参见 第 19.2.5.1 节,“数据库级别复制和二进制日志选项的评估”。您不应该使用这些选项来控制哪些数据库和表被复制。相反,使用副本上的过滤来控制在副本上执行的事件。
在副本侧,对从源服务器接收的语句的执行或忽略决定是根据副本启动时使用的 --replicate-*
选项进行的。(见 第 19.1.6 节,“复制和二进制日志选项和变量”。)这些选项也可以使用 CHANGE REPLICATION FILTER
语句动态设置。这些过滤器的规则是否是在启动时使用 --replicate-*
选项创建的,还是在副本服务器运行时使用 CHANGE REPLICATION FILTER
语句创建的,都是相同的。请注意,不能在 Group Replication 配置的 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.29 节,“复制期间的副本错误”,以获取更多信息。