Documentation Home

16.4.1.29 复制表和临时表

以下段落中的讨论不适用, binlog_format=ROW因为在这种情况下,不会复制临时表;这意味着在副本意外关闭的情况下,副本上永远不会丢失任何临时表。本节的其余部分仅在使用基于语句或混合格式的复制时适用。无论何时,对于涉及可以使用基于语句的格式安全记录的临时表的语句,无论binlog_format何时 STATEMENT,副本上复制的临时表的丢失都可能是一个问题 。MIXED有关基于行的复制和临时表的更多信息,请参阅临时表 的基于行的日志记录.

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

  1. 发表STOP SLAVE SQL_THREAD声明。

  2. 用于SHOW STATUS检查 Slave_open_temp_tables 变量的值。

  3. 如果该值不为 0,则重新启动复制 SQL 线程START SLAVE SQL_THREAD并稍后重复该过程。

  4. 当值为 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(例如norepmytablenorepyourtable等),然后使用 --replicate-wild-ignore-table=norep% 以防止它们被复制。