文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  复制和临时表

19.5.1.32 复制和临时表

在 MySQL 9.0 中,当 binlog_format 设置为 ROWMIXED 时,仅使用临时表的语句不会在源上记录,因此不会复制临时表。涉及混合使用临时表和非临时表的语句仅在源上记录对非临时表的操作,而对临时表的操作不会记录。这意味着在副本上永远不会存在任何临时表,因此在副本意外关闭的情况下不会丢失。有关基于行的复制和临时表的更多信息,请参阅 基于行的临时表日志记录.

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

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

使用临时表时安全关闭副本。 在基于语句的复制模式下,临时表会被复制,但有一种例外情况,即您停止副本服务器(不仅仅是复制线程),并且您复制的临时表正在打开,供尚未在副本上执行的更新使用。如果您停止副本服务器,那么在副本重启时,这些更新所需的临时表将不再可用。为避免此问题,请勿在副本具有打开的临时表时关闭副本。相反,请使用以下过程

  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% 来防止它们被复制。