暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU翻译] MySQL 17.5.1.31 复制和临时表

原创 由迪 2022-11-11
274

在 MySQL 8.0 中, 当 binlog_format设置为 ROWor MIXED,专门使用临时表的语句不会记录在源上,因此不会复制临时表。涉及临时表和非临时表混合的语句仅在源上记录对非临时表的操作,而不记录对临时表的操作。这意味着在副本意外关闭的情况下,副本上永远不会丢失任何临时表。有关基于行的复制和临时表的更多信息,请参阅 基于行的临时表日志记录

binlog_format设置为 时 STATEMENT,对临时表的操作将记录在源上并复制到副本上,前提是可以使用基于语句的格式安全地记录涉及临时表的语句。在这种情况下,副本上复制的临时表丢失可能是一个问题。在基于语句的复制模式下, CREATE TEMPORARY TABLE当 服务器上使用 GTID(即系统变量设置为时)DROP TEMPORARY TABLE时,不能在事务、过程、函数或触发器中使用语句 。在使用 GTID 时,它们可以在这些上下文之外使用,前提是 已设置。 enforce_gtid_consistencyONautocommit=1

由于基于行或混合的复制模式与基于语句的复制模式在临时表方面的行为存在差异,如果更改适用于包含任何打开的临时表的上下文(全局或会话),则无法在运行时切换复制格式表。有关详细信息,请参阅 binlog_format选项说明。

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

  1. 发表STOP REPLICA SQL_THREAD声明。
  2. 用于SHOW STATUS检查 Replica_open_temp_tablesSlave_open_temp_tables 状态变量的值。
  3. 如果该值不为 0,请重新启动复制 SQL 线程START REPLICA SQL_THREAD并稍后重复该过程。
  4. 当值为 0 时,发出mysqladmin 关闭命令以停止副本。

临时表和复制选项。 默认情况下,使用基于语句的复制,所有临时表都会被复制;无论是否有任何匹配--replicate-do-db--replicate-do-table、 或 --replicate-wild-do-table 选项有效,都会发生这种情况。但是, 临时表支持--replicate-ignore-tableand 选项。--replicate-wild-ignore-table例外情况是,为了在会话结束时正确删除临时表,副本总是复制一条DROP TEMPORARY TABLE IF EXISTS语句,而不管通常适用于指定表的任何排除规则。

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

最后修改时间:2022-11-11 16:20:29
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论