在评估复制选项时,副本首先检查是否有任何 --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 节,“表级复制选项的评估”。
Important在这个阶段仍然允许的语句尚未执行。语句直到所有表级选项(如果有)都被检查,并且该过程的结果允许执行语句时,才会执行。
对于二进制日志,涉及的步骤如下:
-
是否有
--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
数据的更新。