副本检查表选项,只有在以下两个条件之一为真时:
-
没有找到匹配的数据库选项。
-
找到一个或多个数据库选项,并根据前一节(见第 19.2.5.1 节,“数据库级复制和二进制日志选项的评估”)的规则评估到“执行”条件。
首先,作为初步条件,副本检查是否启用了基于语句的复制。如果是这样,并且语句发生在存储函数中,副本执行语句并退出。如果启用了基于行的复制,副本不知道源上的存储函数中是否发生了语句,因此该条件不适用。
对于基于语句的复制,复制事件表示语句(所有更改组成一个事件都与单个 SQL 语句关联);对于基于行的复制,每个事件表示单个表行的更改(因此,单个语句,如 UPDATE mytable SET mycol = 1
可能会生成多个基于行的事件)。从事件的角度看,检查表选项的过程对于基于语句和基于行的复制是一样的。
到达这个点,如果没有表选项,副本将执行所有事件。如果有 --replicate-do-table
或 --replicate-wild-do-table
选项,事件必须匹配其中之一,否则将被忽略。如果有 --replicate-ignore-table
或 --replicate-wild-ignore-table
选项,除了匹配这些选项的事件外,所有事件都将被执行。
表级复制过滤器仅应用于查询中明确提到的和操作的表,不应用于查询隐式更新的表。例如,GRANT
语句更新了 mysql.user
系统表,但不提到该表,不受指定 mysql.%
作为通配符模式的过滤器的影响。
以下步骤详细描述了该评估过程。起点是数据库级选项的评估结束,如第 19.2.5.1 节,“数据库级复制和二进制日志选项的评估”所述。
-
是否有表复制选项?
-
是。 继续到步骤 2。
-
否。 执行更新并退出。
-
-
使用哪种日志格式?
-
STATEMENT。 对每个执行更新的语句执行剩余步骤。
-
ROW。 对每个表行的更新执行剩余步骤。
-
-
是否有
--replicate-do-table
选项?-
是。 该表是否匹配其中之一?
-
是。 执行更新并退出。
-
否。 继续到步骤 4。
-
-
否。 继续到步骤 4。
-
-
是否有
--replicate-ignore-table
选项?-
是。 该表是否匹配其中之一?
-
是。 忽略更新并退出。
-
否。 继续到步骤 5。
-
-
否。 继续到步骤 5。
-
-
是否有
--replicate-wild-do-table
选项?-
是。 该表是否匹配其中之一?
-
是。 执行更新并退出。
-
否。 继续到步骤 6。
-
-
否。 继续到步骤 6。
-
-
是否有
--replicate-wild-ignore-table
选项?-
是。 该表是否匹配其中之一?
-
是。 忽略更新并退出。
-
否。 继续到步骤 7。
-
-
否。 继续到步骤 7。
-
-
是否还有其他表需要测试?
-
是。 返回步骤 3。
-
否。 继续步骤 8。
-
-
是否有
--replicate-do-table
或--replicate-wild-do-table
选项?-
是。 忽略更新并退出。
-
否。 执行更新并退出。
-
基于语句的复制如果单个 SQL 语句同时操作了一个包含在 --replicate-do-table
或 --replicate-wild-do-table
选项中的表和另一个被 --replicate-ignore-table
或 --replicate-wild-ignore-table
选项忽略的表,则会停止。副本必须执行或忽略完整的语句(形成复制事件),并且不能逻辑地执行此操作。这也适用于基于行的复制对于 DDL 语句,因为 DDL 语句总是以语句形式记录,而不考虑当前的日志格式。唯一可以更新包含和忽略表并且仍然可以成功复制的语句类型是使用 binlog_format=ROW
记录的 DML 语句。