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

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

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

现象分析

通过收集到的信息,综合分析后发现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的机制

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堆积的情况。

时间: 2024-12-09 20:31:10

关于Relay Log无法自动删除的问题的相关文章

mysql-MHA预发布环境架构分享(八)之relay log的清除

(1)设置relay log的清除方式(在每个slave节点上): mysql -e 'set global relay_log_purge=0' 注意: MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式.在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除.但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被 用到,因此需要禁用中继日志的自动删除功能.

Slave SQL_THREAD如何重放Relay log

复制的介绍: 根据日志定义的模式不一样,可以分为:Statement(SBR)模式,Row(RBR)格式或者是MIXED格式,记录最小的单位是一个Event,binlog日志前4个字节是一个magic number,接下来19个字节记录Format desc evnet:FDE.MySQL5.6版本增加了GTID复制. 下面对三种binlog格式的优缺点: Statement(基于语句级的复制): 优点: 1)Binlog文件较小 2)日志是包含用户执行的原始SQL,方便统计和审计 3)出现最早

MHA 清理relay log(purge_relay_logs)

?? MySQL数据库主从复制在缺省情况下从库的relay logs会在SQL线程执行完毕后被自动删除,但是对于MHA场景下,对于某些滞后从库的恢复依赖于其他从库的relay log,因此采取禁用自动删除功能以及定期清理的办法.对于清理过多过大的relay log需要注意引起的复制延迟资源开销等.MHA可通过purge_relay_logs脚本及配合cronjob来完成此项任务,具体描述如下. 1.purge_relay_logs的功能  a.为relay日志创建硬链接(最小化批量删除大文件导致

Linux应用总结:自动删除n天前日志

linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志,不用每天收到硬盘空间不足的报警短信,想好好休息的话,让我们把这个事情交给机器定时去执行吧. 1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -mtime +30

IIS日志自动删除程序 收藏

很多使用Windows IIS的站长可能都会遇到这个问题,就是服务器的IIS日志增长经常会导致磁盘空间被占满,而IIS也没有自动删除日志的功能,因此需要经常关注即时清理日志,因此我这里就介绍一个能够自动删除IIS日志的程序. 这个删除程序的功能很简单,每天自动删除N天前的日志(时间根据情况自己设置,一般设置为30天),可以使用DOS批处理或VBS脚本来实现. 在下边的解决方案里请大家可以选择适合自己的,总体设计思路是这样的: IIS日志文件的格式是:ex年月日.log 比如:ex071116.l

利用tar进行完全备份、增量备份、差异备份,并控制版本号,自动删除备份文件

因业务需求,需对一个目录进行定期备份,现在使用tar进行自动备份,计划每周一次完整备份,其他每天进行增量或者差异备份,所以写出下面的脚步通过指定参数来选择备份模式.备份文件只保留最近两个完整备份版本和附属的增量或差异备份版本. [[email protected] script]# ./backup.sh          Please select the backup or delete mode,[full|diff|incr|delete|help] [[email protected]

用批处理文件自动备份文件及文件夹,并自动删除n天前的文件

---恢复内容开始--- 下是备份的批处理,添加到"计划任务"中,设定时间自动运行 复制代码 代码如下:@echo off rem 格式化日期 rem date出来的日期是"2006-02-22 星期三",不能直接拿来使用,所以应该先格式化一下 rem 变成我们想要的.date:~0,4的意思是从0开始截取4个字符 set d=%date:~0,4%%date:~5,2%%date:~8,2% rem 设定压缩程序路径,这里用的是WINRAR的rar.exe进行打包

CMD批处理——forfiles命令使用,自动删除过期备份文件

公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服务器去手工删除那些老的文件,有时忘记了就会导致硬盘空间不足而无法备份.因为只要保留最近几天的备份,如果可以做一个批处理让系统自动删除老备份文件就好了,但是Windows的命令行和Linux的Shell比起来功能差了很多,到底行不行我自己也不清楚.于是上网查了一下各位大虾发的帖子,再经过自己的摸索和尝试,发现只要花点功夫还是能实现这个功能的.Windows Server 2003内置的命令行文件,适合于XP以上系统示例:

master log 与relay log的关系

--master log 与relay log的关系 -------------------------------2014/06/09 Just to clarify, there are three sets of file/position coordinates in SHOW SLAVE STATUS: 1) The position, ON THE MASTER, from which the I/O thread is reading: Master_Log_File/Read_M