mysql 清除relay-log文件方法详解

  • Post author:
  • Post category:mysql

mysql 清除relay-log文件方法详解

今天在本机的mysql数据目录下发现了许多类似hostname-relay-bin.0000*的文件,该文件一般是在mysql slave实例上存在。主要用途是记录主从同步的信息,正常情况下会自动删除的。

本机未配置过master、slave,对于其来源还真不太清楚。既然是用在slave上的,那就可以放心的删除。删除master实例上的日志文件用reset master,对于slave实例就使用命令:

 代码如下 复制代码

reset slave

Relay Log无法自动删除的问题

综合分析后发现和以下原因有关。

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

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

顺带也和大家分享下MySQL 内部Logrotate的机制

Binary Log rotate机制:

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

Relay Log rotate 机制:

?6?1Rotate:每从Master fetch一个events后,判断当前文件是否超过 max_relay_log_size 如果超过则自动生成一个新的relay-log-file
?6?1Delete:purge-relay-log 在SQL Thread每执行完一个events时判断,如果该relay-log 已经不再需要则自动删除
?6?1Delete:expire-logs-days 只在 实例启动时 和 flush logs 时判断,如果文件访问时间早于设定值,则purge file  (同Binlog file)  (updated: expire-logs-days和relaylog的purge没有关系)

PS: 因此还是建议配置 expire-logs-days , 否则当我们的外部脚本因意外而停止时,还能有一层保障。

因此建议当slave不再使用时,通过reset slave来取消relaylog



删除 mysql bin-log



首先说明,mysql-bin.00000*类似的文件是mysql的日志文件。

通过命令

 代码如下 复制代码

du -h –max-depth=1 /

查看根目录下每个文件夹所占用存储的大小,发现/var占用了快3G,进一步使用du命令,发现是存放mysql数据文件的文件夹占用了绝大部分空间,进入该文件夹,发现有很多mysql-bin.00000开头的文件,而且其中的某些达到了1G以上,google发现原来这些用户是mysql记录的日志文件,用于数据库崩溃后恢复数据和主从数据库进行数据同步的。如果没有进行主从数据库,可以通过修改配置文件让mysql关闭记录操作日志功能,关闭只需要在log-bin=mysql-bin前加上一个“#”即可,不要忘记重启mysql服务。

清理日志方法为:

 代码如下 复制代码

PURGE MASTER LOGS TO ‘mysql-bin.000013‘; 

PURGE MASTER LOGS BEFORE ‘2010-10-18 00:00:00′;

另外可以通过 RESET MASTER 来删除整个日志文件,注意,如果使用主从数据库,在操作前先确保从数据库已经完全同步了主数据库的数据。
上述命令都是登陆到mysql后执行的。

很多人安装的mysql是开启了日志文件记录的,一般有比较频繁的mysql数据库操作就会产生大量的日志文件在/usr/local/mysql/var/下面,一般产生的日志文件都类似如下:

-rw-rw—- 1 mysql mysql 2.0M Sep 28 17:08 mysql-bin.000001
-rw-rw—- 1 mysql mysql 1.1G Nov 13 14:43 mysql-bin.000002
-rw-rw—- 1 mysql mysql 1.1G Nov 13 15:17 mysql-bin.000003
-rw-rw—- 1 mysql mysql 561M Nov 13 15:52 mysql-bin.000004
-rw-rw—- 1 mysql mysql 904K Nov 13 16:07 mysql-bin.000005
-rw-rw—- 1 mysql mysql 194M Nov 16 16:40 mysql-bin.000006
-rw-rw—- 1 mysql mysql 123M Nov 18 19:18 mysql-bin.000007
-rw-rw—- 1 mysql mysql  456 Nov 16 16:41 mysql-bin.index

从上面可以看到,这些mysql-bin.00000* 类似的文件有的体积非常大,而且一般都在几十MB到几个GB,更甚会吃掉整个硬盘空间,从来导致mysql无法启动或报错,所以在没有必要的情况下我们是可以不用开启日志文件的。

先说下删除mysql日志的方法:

执行:/usr/local/mysql/bin/mysql -u root -p

输入密码登录后再执行:

 代码如下 复制代码

reset master;

这样就可以了,当然也可以手动删除,但是可能会产生一些副作用,我没去证实过。
这些文件是mysql记录的日志文件,用于数据库崩溃后恢复数据和主从数据库进行数据同步的。如果没有进行主从数据库,可以通过修改配置文件让mysql关闭记录操作日志功能,那如何避免以后再产生这些文件呢,如何关闭mysql的日志功能呢?
方法如下:

 代码如下 复制代码
vi /etc/my.cnf

找到:

 代码如下 复制代码

log-bin=mysql-bin

将这行注释掉,前面加上#,再重启mysql就可以了。

假如说你是手工删除的mysql日志文件(mysql-bin.00000*)发现mysql启动不了,那么你看一下mysql-bin.index这个文件是否还存在,如果还存在的话就将mysql-bin.index也删除,然后就可以正常启动了。

其他清理方法(登录数据库情况下):

 代码如下 复制代码

PURGE MASTER LOGS TO ‘mysql-bin.000013′;

PURGE MASTER LOGS BEFORE ’2010-10-18 00:00:00′;