#### 17.5.1.31 复制和临时表

[](<>)[](<>)[](<>)

在 MySQL 8.0 中，当[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)被设定为`排`要么`混合`，专门使用临时表的语句不会记录在源上，因此不会复制临时表。涉及临时表和非临时表混合的语句仅在源上记录非临时表上的操作，而不记录临时表上的操作。这意味着在副本意外关闭的情况下，副本上永远不会丢失任何临时表。有关基于行的复制和临时表的更多信息，请参阅[临时表的基于行的日志记录](replication-rbr-usage.html#replication-rbr-usage-temptables).

什么时候[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)被设定为`陈述`，对临时表的操作记录在源上并复制到副本上，前提是可以使用基于语句的格式安全地记录涉及临时表的语句。在这种情况下，副本上复制的临时表丢失可能是一个问题。在基于语句的复制模式下，[`创建临时表`](create-table.html)和[`删除临时表`](drop-table.html)当 GTID 在服务器上使用时（即，当[`强制gtid_consistency`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)系统变量设置为`在`）。在使用 GTID 时，它们可以在这些上下文之外使用，前提是[`自动提交=1`](server-system-variables.html#sysvar_autocommit)一切就绪。

由于基于行或混合复制模式与基于语句的复制模式在临时表方面的行为不同，如果更改应用于包含任何打开的临时表的上下文（全局或会话），则无法在运行时切换复制格式。有关更多详细信息，请参阅[`binlog_格式`](replication-options-binary-log.html#sysvar_binlog_format)选项

**使用临时表时安全关闭复制副本。**在基于语句的复制模式下，将复制临时表，除非您停止了副本服务器（不仅仅是复制线程），并且复制了临时表，这些临时表已打开，可用于尚未在副本上执行的更新。如果停止复制副本服务器，则在重新启动复制副本时，这些更新所需的临时表将不再可用。为避免此问题，请不要在复制副本打开临时表时关闭复制副本。相反，请使用以下步骤：

1.  问题a`停止复制SQL_线程`陈述

2.  使用[`显示状态`](show-status.html)检查[`副本\u打开\u临时\u表`](server-status-variables.html#statvar_Replica_open_temp_tables)或[`从属\u打开\u临时\u表`](server-status-variables.html#statvar_Slave_open_temp_tables)状态变量。

3.  如果该值不是0，请使用重新启动复制SQL线程`启动复制SQL_线程`稍后重复这个过程。

4.  当值为0时，发出一个[**关闭**](mysqladmin.html)命令停止复制副本。

**临时表和复制选项。**默认情况下，使用基于语句的复制，将复制所有临时表；无论是否存在匹配项，都会发生这种情况[`--复制do数据库`](replication-options-replica.html#option_mysqld_replicate-do-db), [`--复制do表`](replication-options-replica.html#option_mysqld_replicate-do-table)或[`--复制野生do表`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)有效的选项。然而[`--复制忽略表`](replication-options-replica.html#option_mysqld_replicate-ignore-table)和[`--复制野生忽略表`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table)对于临时表，我们很荣幸提供选项。例外情况是，为了在会话结束时正确删除临时表，复制副本总是复制临时表`删除临时表（如果存在）`语句，而不考虑通常适用于指定表的任何排除规则。

使用基于语句的复制时，推荐的做法是指定一个前缀，以便在命名不希望复制的临时表时独占使用，然后使用[`--复制野生忽略表`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table)选项以匹配该前缀。例如，您可以给所有这样的表命名，以`诺雷普`（例如`norepmytable`, `去你的桌子`，等等），然后使用[`--复制野生忽略表=norep%`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table)防止它们被复制。
