16.2.5.2 table 级复制选项的评估

仅当满足以下两个条件之一时,副本服务器才会检查并评估 table 选项:

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

Note

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

到此为止,如果没有 table 选项,则副本仅执行所有事件。如果有--replicate-do-table--replicate-wild-do-table选项,则要执行的事件必须与其中之一匹配;否则,该事件必须与其中一个匹配。否则,它将被忽略。如果有--replicate-ignore-table--replicate-wild-ignore-table选项,则将执行所有事件,与那些选项中的任何一个都匹配的事件除外。

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

  • 有 table 复制选项吗?

  • 是. continue 执行步骤 2.

  • 否. 执行更新并退出。

  • 使用哪种日志格式?

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

  • ROW. 对 table 行的每次更新执行其余步骤。

  • --replicate-do-table个选项吗?

  • 是. table 格是否与其中任何一个匹配?

  • 是. 执行更新并退出。

    • 否. continue 执行步骤 4.
  • 否. continue 执行步骤 4.

  • --replicate-ignore-table个选项吗?

  • 是. table 格是否与其中任何一个匹配?

  • 是. 忽略更新并退出。

    • 否. continue 执行步骤 5.
  • 否. continue 执行步骤 5.

  • --replicate-wild-do-table个选项吗?

  • 是. table 格是否与其中任何一个匹配?

  • 是. 执行更新并退出。

    • 否. continue 执行步骤 6.
  • 否. continue 执行步骤 6.

  • --replicate-wild-ignore-table个选项吗?

  • 是. table 格是否与其中任何一个匹配?

  • 是. 忽略更新并退出。

    • 否. continue 执行步骤 7.
  • 否. continue 执行步骤 7.

  • 还有另一个要测试的 table 吗?

  • 是. 返回第 3 步。

  • 否. continue 执行步骤 8.

  • --replicate-do-table--replicate-wild-do-table选项吗?

  • 是. 忽略更新并退出。

  • 否. 执行更新并退出。

Note

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