副本仅在以下两个条件之一为真的情况下,才会检查并评估表选项
未找到匹配的数据库选项。
找到一个或多个数据库选项,并且根据上一节中描述的规则对其进行评估以得出“执行”条件(参见第 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 语句。