Documentation Home

17.5.1.31 复制和临时表

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

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

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

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

  1. 发表STOP REPLICA SQL_THREAD声明。

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

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

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