在 MySQL 8.4 中,当 binlog_format
设置为 ROW
或 MIXED
时,仅使用临时表的语句不会在源上记录,因此不会复制临时表。涉及临时表和非临时表的混合语句仅在源上记录针对非临时表的操作,而针对临时表的操作不会记录。这意味着副本上永远不会有任何临时表,因此在副本意外关闭时不会丢失。有关基于行的复制和临时表的更多信息,请参见 基于行的临时表日志记录。
当 binlog_format
设置为 STATEMENT
时,对临时表的操作将在源上记录并在副本上复制,前提是涉及临时表的语句可以使用基于语句的格式安全地记录。在这种情况下,副本上复制的临时表的丢失可能是一个问题。在基于语句的复制模式下,CREATE TEMPORARY TABLE
和 DROP TEMPORARY TABLE
语句不能在服务器上使用 GTID 时(即,当 enforce_gtid_consistency
系统变量设置为 ON
时)在事务、过程、函数或触发器内使用。它们可以在使用 GTID 时在这些上下文之外使用,前提是 autocommit=1
设置。
由于基于行或混合复制模式与基于语句的复制模式在临时表方面的行为存在差异,因此,如果更改适用于包含任何打开的临时表的上下文(全局或会话),则您不能在运行时切换复制格式。有关更多详细信息,请参见 binlog_format
选项的说明。
使用临时表时安全关闭副本。在基于语句的复制模式下,临时表将被复制,但您停止副本服务器(不仅仅是复制线程)并且您复制的临时表已打开以供尚未在副本上执行的更新使用时除外。如果您停止副本服务器,则在副本重新启动时,这些更新所需的临时表将不再可用。为了避免此问题,请勿在副本具有打开的临时表时关闭副本。相反,请使用以下步骤
发出
STOP REPLICA SQL_THREAD
语句。使用
SHOW STATUS
检查Replica_open_temp_tables
状态变量的值。如果该值不为 0,请使用
START REPLICA SQL_THREAD
重新启动复制 SQL 线程,并在稍后重复此步骤。当该值为 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
开头(例如 norepmytable
、norepyourtable
等),然后使用 --replicate-wild-ignore-table=norep%
来阻止它们被复制。