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