在评估复制选项时,副本首先检查是否存在任何 --replicate-do-db
或 --replicate-ignore-db
选项。在使用 --binlog-do-db
或 --binlog-ignore-db
时,过程类似,但选项在源上进行检查。
要检查匹配的数据库取决于正在处理的语句的二进制日志格式。如果语句使用行格式进行日志记录,则要检查的数据库是数据将要更改的数据库。如果语句使用语句格式进行日志记录,则要检查的数据库是默认数据库(使用 USE
语句指定)。
只有 DML 语句可以使用行格式进行日志记录。DDL 语句始终以语句的形式进行日志记录,即使 binlog_format=ROW
也是如此。因此,所有 DDL 语句始终根据基于语句的复制规则进行过滤。这意味着您必须使用 USE
语句显式选择默认数据库,才能应用 DDL 语句。
对于复制,所涉及的步骤如下所示
使用哪种日志记录格式?
STATEMENT. 测试默认数据库。
ROW. 测试受更改影响的数据库。
是否存在任何
--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
中数据的那些更新。