在 MySQL 8.3 中,当 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 服务器,用于这些更新的临时表将不可用。为了避免这个问题,不要在 replica 上打开临时表时关闭它。相反,使用以下过程:
-
发出
STOP REPLICA SQL_THREAD
语句。 -
使用
SHOW STATUS
检查Replica_open_temp_tables
状态变量的值。 -
如果值不为 0,使用
START REPLICA SQL_THREAD
重启复制 SQL 线程,并稍后重复该过程。 -
当值为 0 时,发出 mysqladmin shutdown 命令停止 replica。
临时表和复制选项 默认情况下,在基于语句的复制中,所有临时表都将被复制;这将发生,无论是否有匹配的 --replicate-do-db
、--replicate-do-table
或 --replicate-wild-do-table
选项在生效。然而,--replicate-ignore-table
和 --replicate-wild-ignore-table
选项将被尊重用于临时表。唯一的例外是为了正确删除会话结束时的临时表,replica 总是复制 DROP TEMPORARY TABLE IF EXISTS
语句,无论是否有排除规则适用于指定的表。
使用基于语句的复制时,推荐的做法是为不想复制的临时表指定一个专用前缀,然后使用--replicate-wild-ignore-table
选项来匹配该前缀。例如,您可以将所有这些表命名为以norep
开头(例如:norepmytable
、norepyourtable
等),然后使用--replicate-wild-ignore-table=norep%
来防止它们被复制。