文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  表级复制选项的评估

19.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.% 指定为通配符模式的过滤器的影响。

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

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

    • 是。  继续执行步骤 2。

    • 否。  执行更新并退出。

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

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

    • ROW。  对表行更新的每个更新执行剩余步骤。

  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 选项?

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

    • 否。  执行更新并退出。

注意

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