16.4.1.29 复制和临时 table

以下各节的讨论不适用于binlog_format=ROW,因为在这种情况下,不会复制临时 table;这意味着,如果计划外关闭副本,副本上绝不会丢失任何临时 table。本节的其余部分仅在使用基于语句或混合格式的复制时适用。每当binlog_formatSTATEMENTMIXED时,副本上复制的临时 table 的丢失都会成为一个问题,因为涉及临时 table 的语句可以使用基于语句的格式安全地记录。有关基于行的复制和临时 table 的更多信息,请参见临时 table 的基于行的日志记录

使用临时 table 时安全关闭副本. 临时 table 将被复制,除非您停止了副本服务器(不仅是复制线程),而且已经复制了可用于尚未更新的更新的临时 table。已在副本上执行。如果停止副本服务器,则重新启动副本时,这些更新所需的临时 table 将不再可用。为避免此问题,请勿在打开临时 table 的情况下关闭副本。而是,使用以下过程:

  • 发出STOP SLAVE SQL_THREAD声明。

  • 使用SHOW STATUS检查Slave_open_temp_tables变量的值。

  • 如果该值不为 0,请使用START SLAVE SQL_THREAD重新启动复制 SQL 线程,并在以后重复该过程。

  • 值为 0 时,发出mysqladmin shutdown命令停止副本。

临时 table 和复制选项. 默认情况下,所有临时 table 都被复制;无论是否存在任何匹配的--replicate-do-db--replicate-do-table--replicate-wild-do-table选项,都会发生这种情况。但是,--replicate-ignore-table--replicate-wild-ignore-table选项适用于临时 table。唯一的 exception 是,为了在会话结束时能够正确删除临时 table,副本始终复制DROP TEMPORARY TABLE IF EXISTS语句,而不管通常适用于指定 table 的任何排除规则。

使用基于语句的复制或混合格式的复制时,建议的做法是指定一个前缀以专用于命名您不想复制的临时 table,然后使用--replicate-wild-ignore-table选项来匹配该前缀。例如,您可以为所有此类 table 提供以norep开头的名称(例如norepmytablenorepyourtable等),然后使用--replicate-wild-ignore-table=norep%防止它们被复制。