16.2.5.2 表级复制选项的评估

仅当以下两个条件之一为真时,副本才会检查和评估表选项:

首先,作为一个初步条件,副本检查是否启用了基于语句的复制。如果是这样,并且该语句发生在存储函数中,则副本执行该语句并退出。如果启用了基于行的复制,则副本不知道源上的存储函数中是否发生了语句,因此此条件不适用。

笔记

对于基于语句的复制,复制事件表示语句(构成给定事件的所有更改都与单个 SQL 语句相关联);对于基于行的复制,每个事件代表单个表行中的更改(因此单个语句UPDATE mytable SET mycol = 1可能会产生许多基于行的事件)。从事件的角度来看,检查表选项的过程对于基于行和基于语句的复制是相同的。

达到这一点后,如果没有表选项,副本将简单地执行所有事件。如果有任何 --replicate-do-table--replicate-wild-do-table 选项,如果要执行,事件必须匹配其中之一;否则,它会被忽略。如果有任何 --replicate-ignore-table--replicate-wild-ignore-table 选项,则执行除与这些选项中的任何一个匹配的事件之外的所有事件。

重要的

表级复制过滤器仅适用于在查询中明确提及和操作的表。它们不适用于查询隐式更新的表。例如,GRANT 更新mysql.user 系统表但未提及该表的语句不受指定mysql.%为通配符模式的过滤器的影响。

以下步骤更详细地描述了此评估。起点是数据库级选项评估的结束,如 第 16.2.5.1 节“数据库级复制和二进制日志记录选项的评估”中所述。

  1. 是否有任何表复制选项?

    • 是的。  继续第 2 步。

    • 否。  执行更新并退出。

  2. 使用哪种日志记录格式?

    • 陈述。  对每个执行更新的语句执行剩余的步骤。

    • 排。  对表行的每次更新执行剩余的步骤。

  3. 有什么 --replicate-do-table选择吗?

    • 是的。  该表与其中任何一个匹配吗?

      • 是的。  执行更新并退出。

      • 否  。继续第 4 步。

    • 否  。继续第 4 步。

  4. 有什么 --replicate-ignore-table 选择吗?

    • 是的。  该表与其中任何一个匹配吗?

      • 是的。  忽略更新并退出。

      • 否  。继续第 5 步。

    • 否  。继续第 5 步。

  5. 有什么 --replicate-wild-do-table 选择吗?

    • 是的。  该表与其中任何一个匹配吗?

      • 是的。  执行更新并退出。

      • 否  。继续第 6 步。

    • 否  。继续第 6 步。

  6. 有什么 --replicate-wild-ignore-table 选择吗?

    • 是的。  该表与其中任何一个匹配吗?

      • 是的。  忽略更新并退出。

      • 否  。继续第 7 步。

    • 否  。继续第 7 步。

  7. 还有别的表要测试吗?

    • 是的。  回到第 3 步。

    • 否  。继续第 8 步。

  8. 有什么 --replicate-do-table选择 --replicate-wild-do-table 吗?

    • 是的。  忽略更新并退出。

    • 否。  执行更新并退出。

笔记

--replicate-do-table如果单个 SQL 语句同时对or 选项 包含的 表和or --replicate-wild-do-table 忽略的另一个表进行 操作,则基于语句的复制将停止--replicate-ignore-table--replicate-wild-ignore-table 选项。副本必须执行或忽略完整的语句(形成复制事件),并且它不能在逻辑上这样做。这也适用于 DDL 语句的基于行的复制,因为 DDL 语句总是作为语句记录,而不考虑有效的日志记录格式。唯一可以同时更新包含表和忽略表并仍能成功复制的语句类型是使用 记录的 DML 语句 binlog_format=ROW