在MySQL 8.0中,当binlog_format
被设置为行
或混合
,专门使用临时表的语句不登录源,因此临时表不是复制。语句涉及的临时和永久表登录操作的源只有永久表、临时表上和操作记录。这意味着永远不会有任何临时表的副本丢失事件意外关闭的副本。对基于行的复制和临时表的更多信息,见基于行的日志记录的临时表。
当binlog_format
被设置为声明
对临时表、操作登录源和复制副本,提供涉及临时表的语句可以记录安全使用statement-based格式。在这种情况下,损失的临时表复制副本可以是一个问题。在statement-based复制模式下,创建临时表
和删除临时表
语句不能使用在一个事务中,过程,函数,或触发GTIDs正在使用服务器上的(也就是说,当enforce_gtid_consistency
系统变量设置为在
)。这样他们可以使用外部环境中GTIDs在使用时,提供自动提交= 1
是集。
因为基于行的之间的行为差异或混合复制模式和statement-based复制模式关于临时表,你不能在运行时切换复制格式,如果更改适用于上下文(全球或会话),它包含所有打开的临时表。更多细节,请参阅的描述binlog_format
选择。
安全的复制品使用临时表时关闭。在statement-based复制模式下,临时表复制除了你停止复制服务器的情况(而不仅仅是复制线程)和复制的临时表,用于更新开放尚未执行的复制品。如果你停止复制服务器,这些更新所需的临时表副本重新启动时不再可用。为了避免这个问题,不要关闭临时表的复制品而开放。相反,使用下列程序:
发出一个
停止|奴隶SQL_THREAD复制品
声明。使用
显示状态
检查的价值Slave_open_temp_tables
变量。如果该值不是0,重启SQL复制线程
开始|奴隶SQL_THREAD复制品
然后重复这个过程。当该值为0,一个问题mysqladmin关闭命令来停止复制。
临时表和复制选项。默认情况下,对于statement-based复制,复制所有临时表;这种情况是否有任何匹配——replicate-do-db
,——replicate-do-table
,或——replicate-wild-do-table
选项的效果。然而,——replicate-ignore-table
和——replicate-wild-ignore-table
临时表的选项是荣幸。例外是使正确删除临时表在会话结束时,一个总是复制一个复制品删除临时表是否存在
声明中,无论任何排除规则,通常会申请指定的表。
推荐的做法当使用statement-based复制指定前缀的命名临时表,你不希望复制,然后使用——replicate-wild-ignore-table
选择与之匹配的前缀。例如,您可能会给所有这些表的名字开始norep
(如norepmytable
,norepyourtable
等等),然后使用——replicate-wild-ignore-table = norep %
阻止他们被复制。