Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Replication and Temporary Tables

19.5.1.31 复制和临时表

在 MySQL 8.3 中,当 binlog_format 设置为 ROWMIXED,仅使用临时表的语句不会在源上记录,因此临时表不会被复制。涉及临时表和非临时表的语句将在源上仅记录非临时表的操作,而临时表的操作不会记录。这意味着,在 replica 不计划关闭的情况下,永远不会丢失临时表。有关基于行的复制和临时表的更多信息,请参阅 基于行的临时表记录

binlog_format 设置为 STATEMENT,临时表的操作将在源上记录并在 replica 上复制,前提是涉及临时表的语句可以安全地使用基于语句的格式记录。在这种情况下,replica 上的复制临时表可能会丢失。在基于语句的复制模式下,CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 语句不能在事务、过程、函数或触发器中使用 GTIDs 时使用(即当 enforce_gtid_consistency 系统变量设置为 ON 时)。它们可以在 GTIDs 使用时在这些上下文之外使用,前提是 autocommit=1 设置。

由于基于行或混合复制模式和基于语句的复制模式之间的行为差异,无法在运行时更改复制格式,如果更改适用于包含打开临时表的上下文(全局或会话)。有关更多详细信息,请参阅 binlog_format 选项的描述。

使用临时表时的安全 replica 关闭  在基于语句的复制模式下,临时表将被复制,除非您停止 replica 服务器(而不是仅停止复制线程),并且您有打开的临时表用于尚未在 replica 上执行的更新。如果您停止 replica 服务器,用于这些更新的临时表将不可用。为了避免这个问题,不要在 replica 上打开临时表时关闭它。相反,使用以下过程:

  1. 发出 STOP REPLICA SQL_THREAD 语句。

  2. 使用 SHOW STATUS 检查 Replica_open_temp_tables 状态变量的值。

  3. 如果值不为 0,使用 START REPLICA SQL_THREAD 重启复制 SQL 线程,并稍后重复该过程。

  4. 当值为 0 时,发出 mysqladmin shutdown 命令停止 replica。

临时表和复制选项  默认情况下,在基于语句的复制中,所有临时表都将被复制;这将发生,无论是否有匹配的 --replicate-do-db--replicate-do-table--replicate-wild-do-table 选项在生效。然而,--replicate-ignore-table--replicate-wild-ignore-table 选项将被尊重用于临时表。唯一的例外是为了正确删除会话结束时的临时表,replica 总是复制 DROP TEMPORARY TABLE IF EXISTS 语句,无论是否有排除规则适用于指定的表。

使用基于语句的复制时,推荐的做法是为不想复制的临时表指定一个专用前缀,然后使用--replicate-wild-ignore-table选项来匹配该前缀。例如,您可以将所有这些表命名为以norep开头(例如:norepmytablenorepyourtable等),然后使用--replicate-wild-ignore-table=norep%来防止它们被复制。