19.5.1.31 复制和临时表
在 MySQL 8.4 中,当binlog_format
设置为 ROW
或 MIXED
时,仅使用临时表的语句不会在源端被记录,因此临时表不会被复制。涉及临时表和非临时表的语句在源端只记录非临时表的操作,而临时表的操作不会被记录。这意味着,在 replica 事件发生时,临时表不会被丢失。关于行基于的复制和临时表的详细信息,请见行基于的临时表日志记录。
当binlog_format
设置为 STATEMENT
时,临时表的操作在源端被记录并在 replica 中被复制,提供临时表可以被安全地使用语句格式记录。在这种情况下, replica 中的临时表丢失可能会是一个问题。在语句基于的复制模式下,CREATE TEMPORARY TABLE
和 DROP TEMPORARY TABLE
语句不能在事务、存储程序、函数或触发器中使用,如果在服务器上启用了 GTIDs(即enforce_gtid_consistency
系统变量设置为 ON
)。它们可以在不使用 GTIDs 的情况下使用,提供autocommit=1
设置。
由于行基于的复制模式和语句基于的复制模式之间的临时表行为差异,您不能在运行时更改复制格式,如果更改适用于包含打开临时表的上下文。详细信息请见binlog_format
选项的描述。
在使用临时表时安全地关闭 replica。 在语句基于的复制模式下,临时表除非在您停止 replica 服务器(而不是只停止复制线程)并且有已打开的临时表用于更新操作,这些操作还没有在 replica 中执行。在您停止 replica 服务器时,需要这些更新操作的临时表将不可用。为了避免这个问题,请使用以下过程:
-
发出
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%
来防止它们被复制。