以下段落中的讨论不适用,
binlog_format=ROW
因为在这种情况下,不会复制临时表;这意味着在副本意外关闭的情况下,副本上永远不会丢失任何临时表。本节的其余部分仅在使用基于语句或混合格式的复制时适用。无论何时,对于涉及可以使用基于语句的格式安全记录的临时表的语句,无论binlog_format
何时
STATEMENT
,副本上复制的临时表的丢失都可能是一个问题
。MIXED
有关基于行的复制和临时表的更多信息,请参阅临时表
的基于行的日志记录.
使用临时表时安全副本关闭。 临时表会被复制,除非您停止了副本服务器(不仅仅是副本线程)并且您已经复制了临时表,这些临时表已打开以用于尚未在副本上执行的更新。如果停止副本服务器,则当副本重新启动时,这些更新所需的临时表将不再可用。为避免此问题,请不要在副本打开临时表时关闭它。相反,请使用以下过程:
发表
STOP SLAVE SQL_THREAD
声明。用于
SHOW STATUS
检查Slave_open_temp_tables
变量的值。如果该值不为 0,则重新启动复制 SQL 线程
START SLAVE SQL_THREAD
并稍后重复该过程。当值为 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%
以防止它们被复制。