仅当以下两个条件之一成立时,从属设备才会检查并评估表选项:
找不到匹配的数据库选项。
找到了一个或多个数据库选项,并根据上一节中所述的规则对其进行了评估,以达到“ 执行 ”条件(请参见 第17.2.3.1节“数据库级复制和二进制日志记录选项的评估”)。
首先,作为一个初步条件,从服务器检查是否启用了基于语句的复制。如果是这样,并且该语句出现在存储的函数中,则从站执行该语句并退出。如果启用了基于行的复制,则从服务器将不知道是否在主服务器上的存储函数中发生了语句,因此该条件不适用。
注意
对于基于语句的复制,复制事件表示语句(组成给定事件的所有更改都与单个SQL语句相关联);对于基于行的复制,每个事件都代表单个表行中的更改(因此,诸如这样的单个语句UPDATE mytable SET mycol = 1可能会产生许多基于行的事件)。从事件的角度来看,基于行的复制和基于语句的复制的检查表选项的过程都是相同的。
到此为止,如果没有表选项,则从站仅执行所有事件。如果有任何 选项,则要执行的事件必须与其中之一匹配;–replicate-do-table否则 --replicate-wild-do-table,该事件必须与其中之一匹配。否则,它将被忽略。如果有任何一个 --replicate-ignore-table或 --replicate-wild-ignore-table 选项,则执行所有事件,除了那些与这些选项中的任何一个匹配的事件。
以下步骤更详细地描述了此评估。起点是评估数据库级选项的结尾,如 第17.2.3.1节“评估数据库级复制和二进制日志记录选项”所述。
有表复制选项吗?
是。 继续执行步骤2。
否。 执行更新并退出。
使用哪种日志格式?
声明。 对执行更新的每个语句执行其余步骤。
行。 对表行的每次更新执行其余步骤。
有什么 --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 选项。从站必须执行或忽略complete语句(形成复制事件),并且它不能在逻辑上执行此操作。这也适用于DDL语句的基于行的复制,因为DDL语句始终作为语句记录,而不考虑有效的记录格式。可以同时更新包含表和被忽略表并仍能成功复制的唯一类型的语句是已使用以下命令记录的DML语句 binlog_format=ROW。