Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

19.5.1.31 复制和临时表

在 MySQL 8.4 中,当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 服务器时,需要这些更新操作的临时表将不可用。为了避免这个问题,请使用以下过程:

  1. 发出 STOP REPLICA SQL_THREAD 语句。

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

  3. 如果值不是0,使用START REPLICA SQL_THREAD命令重新启动复制SQL线程,并在后续重复该过程。

  4. 当值为0时,使用mysqladmin shutdown命令停止复制。

临时表和复制选项。 默认情况下,在语句级别复制中,所有临时表都会被复制,这是无论是否存在任何匹配的--replicate-do-db--replicate-do-table--replicate-wild-do-table选项。然而,--replicate-ignore-table--replicate-wild-ignore-table选项对临时表有效。唯一的例外是,为了正确地在会话结束时删除临时表,复制总是复制一个DROP TEMPORARY TABLE IF EXISTS语句,无论任何排除规则对指定表的应用。

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