关于Relay Log没法自动删除的问题

本文介绍了一次运维实践中relay-log长期没法自动删除的缘由和解决过程mysql

 

 

背景: 今天在运维一个mysql实例时,发现其数据目录下的relay-log 长期没有删除,已经堆积了几十个relay-log。 然而其余做为Slave服务器实例却没有这种状况。sql

 

现象分析

经过收集到的信息,综合分析后发现relay-log没法自动删除和如下缘由有关。服务器

  • 该实例原先是一个Slave:致使relay-log 和 relay-log.index的存在
  • 该实例目前已经不是Slave:因为没有了IO-Thread,致使relay-log-purge 没有起做用( 这也是其余Slave实例没有这种状况的缘由,由于IO-thread会作自动rotate操做)。
  • 该实例天天会进行平常备份:Flush logs的存在,致使天天会生成一个relay-log
  • 该实例没有配置expire-logs-days:致使flush logs时,也不会作relay-log清除

简而言之就是: 一个实例若是以前是Slave,而以后停用了(stop slave),且没有配置expire-logs-days的状况下,会出现relay-log堆积的状况。运维

深刻分析

顺带也和你们分享下MySQL 内部Logrotate的机制fetch

Binary Log rotate机制:

  • Rotate:每一条binary log写入完成后,都会判断当前文件是否超过max_binlog_size ,若是超过则自动生成一个binlog file
  • Delete:expire-logs-days 只在 实例启动时 和 flush logs 时判断,若是文件访问时间早于设定值,则purge file

Relay Log rotate 机制:

  • Rotate:每从Master fetch一个events后,判断当前文件是否超过max_relay_log_size 若是超过则自动生成一个新的relay-log-file
  • Delete: purge-relay-log 在SQL Thread每执行完一个events时判断,若是该relay-log 已经再也不须要则自动删除
  • Delete: expire-logs-days 只在 实例启动时 和 flush logs 时判断,若是文件访问时间早于设定值,则purge file (同Binlog file) (updated: expire-logs-days和relaylog的purge没有关系) 
    PS: 所以仍是建议配置 expire-logs-days , 不然当咱们的外部脚本因意外而中止时,还能有一层保障。

所以建议当slave再也不使用时,经过reset slave来取消relaylog,以避免出现relay-log堆积的状况。code

相关文章
相关标签/搜索