19.2.5.2 表级复制选项评估
复制服务器仅在满足以下两个条件之一时检查和评估表级选项:
-
没有找到匹配的数据库选项。
-
找到一个或多个数据库选项,并根据前一节(见第19.2.5.1节,“数据库级复制和二进制日志选项评估”)的规则来评估这些选项,以确定一个““execute””条件。
首先,复制服务器检查是否启用了语句级复制。如果启用,并且语句出现在存储函数中,复制服务器执行语句并退出。如果启用了行级复制,复制服务器不知道源服务器是否在存储函数中执行语句,因此不适用这个条件。
对于语句级复制,复制事件表示语句(所有更改都与单个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 语句。