在评估复制选项时,副本首先检查是否有任何适用的 --replicate-do-db
或 --replicate-ignore-db
选项。使用 --binlog-do-db
或 --binlog-ignore-db
时,过程类似,但会在源上检查选项。
检查匹配项的数据库取决于正在处理的语句的二进制日志格式。如果使用行格式记录了该语句,则要更改数据的数据库就是被检查的数据库。如果使用语句格式记录了该语句,则默认数据库(使用 USE
语句指定)是被检查的数据库。
只有 DML 语句可以使用行格式记录。DDL 语句始终记录为语句,即使 binlog_format=ROW
。因此,所有 DDL 语句始终根据基于语句的复制规则进行过滤。这意味着您必须使用 USE
语句显式选择默认数据库,以便应用 DDL 语句。
对于复制,涉及的步骤如下:
使用哪种日志记录格式?
语句。测试默认数据库。
行。测试受更改影响的数据库。
是否有任何
--replicate-do-db
选项?是。数据库是否与其中任何一个匹配?
是。继续执行步骤 4。
否。忽略更新并退出。
否。继续执行步骤 3。
是否有任何
--replicate-ignore-db
选项?是。数据库是否与其中任何一个匹配?
是。忽略更新并退出。
否。继续执行步骤 4。
否。继续执行步骤 4。
继续检查表级复制选项(如果有)。有关如何检查这些选项的说明,请参阅 第 19.2.5.2 节,“表级复制选项的评估”。
重要在此阶段仍允许的语句实际上尚未执行。只有在检查了所有表级选项(如果有)并且该过程的结果允许执行该语句后,才会执行该语句。
对于二进制日志记录,涉及的步骤如下:
是否有任何
--binlog-do-db
或--binlog-ignore-db
选项?是。继续执行步骤 2。
否。记录语句并退出。
是否有默认数据库(是否有任何数据库被
USE
选择)?是。继续执行步骤 3。
否。忽略语句并退出。
存在一个默认数据库。是否有任何
--binlog-do-db
选项?是。 它们中是否与该数据库匹配?
是。 记录语句并退出。
否。忽略语句并退出。
否。继续执行步骤 4。
是否有任何
--binlog-ignore-db
选项与该数据库匹配?是。 忽略该语句并退出。
否。记录语句并退出。
对于基于语句的日志记录,对于 CREATE DATABASE
、ALTER DATABASE
和 DROP DATABASE
语句,在上述规则中存在一个例外。在这些情况下,在确定是记录还是忽略更新时,正在被 创建、更改或删除 的数据库会替换默认数据库。
--binlog-do-db
有时可能意味着 “忽略其他数据库”。 例如,当使用基于语句的日志记录时,仅使用 --binlog-do-db=sales
运行的服务器不会将默认数据库与 sales
不同的语句写入二进制日志。当使用具有相同选项的基于行的日志记录时,服务器仅记录那些更改 sales
中数据的更新。