#### 17.2.5.2 评估表级复制选项

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

-   未找到匹配的数据库选项。

-   找到一个或多个数据库选项，并根据上一节中描述的规则评估以达到“执行”条件（参见[第 17.2.5.1 节，“评估数据库级复制和二进制日志记录选项”](replication-rules-db-options.html)）。

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

笔记

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

达到这一点后，如果没有表选项，副本将简单地执行所有事件。如果有的话[`--replicate-do-table`](replication-options-replica.html#option_mysqld_replicate-do-table)要么[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)选项，如果要执行，事件必须匹配其中之一；否则，将被忽略。如果有的话[`--复制忽略表`](replication-options-replica.html#option_mysqld_replicate-ignore-table)要么[`--replicate-wild-ignore-table`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table)选项，所有事件都被执行，除了那些与这些选项中的任何一个匹配的事件。

重要的

表级复制过滤器仅适用于查询中明确提及和操作的表。它们不适用于查询隐式更新的表。例如，一个[`授予`](grant.html)声明，它更新`mysql.user`系统表但未提及该表，不受指定过滤器的影响`mysql.%`作为通配符模式。

以下步骤更详细地描述了此评估。起点是评估数据库级选项的结束，如中所述[第 17.2.5.1 节，“评估数据库级复制和二进制日志记录选项”](replication-rules-db-options.html).

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

    -   **是的。**继续第 2 步。

    -   **不。**执行更新并退出。

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

    -   **陈述。**为执行更新的每个语句执行其余步骤。

    -   **排。**对表行的每次更新执行其余步骤。

3.  有没有[`--replicate-do-table`](replication-options-replica.html#option_mysqld_replicate-do-table)选项？

    -   **是的。**该表是否与其中任何一个匹配？

        -   **是的。**执行更新并退出。

        -   **不。**继续执行步骤 4。

    -   **不。**继续执行步骤 4。

4.  有没有[`--复制忽略表`](replication-options-replica.html#option_mysqld_replicate-ignore-table)选项？

    -   **是的。**该表是否与其中任何一个匹配？

        -   **是的。**忽略更新并退出。

        -   **不。**继续第 5 步。

    -   **不。**继续第 5 步。

5.  有没有[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)选项？

    -   **是的。**该表是否与其中任何一个匹配？

        -   **是的。**执行更新并退出。

        -   **不。**继续第 6 步。

    -   **不。**继续第 6 步。

6.  有没有[`--replicate-wild-ignore-table`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table)选项？

    -   **是的。**该表是否与其中任何一个匹配？

        -   **是的。**忽略更新并退出。

        -   **不。**继续执行步骤 7。

    -   **不。**继续执行步骤 7。

7.  还有要测试的表吗？

    -   **是的。**返回第 3 步。

    -   **不。**继续执行步骤 8。

8.  有没有[`--replicate-do-table`](replication-options-replica.html#option_mysqld_replicate-do-table)要么[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)选项？

    -   **是的。**忽略更新并退出。

    -   **不。**执行更新并退出。

笔记

如果单个 SQL 语句对包含在[`--replicate-do-table`](replication-options-replica.html#option_mysqld_replicate-do-table)要么[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)选项，以及另一个被 a 忽略的表[`--复制忽略表`](replication-options-replica.html#option_mysqld_replicate-ignore-table)要么[`--replicate-wild-ignore-table`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table)选项。副本必须执行或忽略完整的语句（形成复制事件），并且它不能在逻辑上执行此操作。这也适用于 DDL 语句的基于行的复制，因为 DDL 语句始终记录为语句，而不考虑有效的日志记录格式。唯一可以更新包含表和忽略表并且仍然可以成功复制的语句类型是已记录的 DML 语句[`binlog_format=行`](replication-options-binary-log.html#sysvar_binlog_format).
