文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

19.5.1.31 复制和临时表

在 MySQL 8.4 中,当 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% 来阻止它们被复制。