签到成功

知道了

CNDBA社区CNDBA社区

MySQL 清除 binlog 和 relay log 方法说明

2021-08-21 16:24 3114 0 原创 MySQL
作者: dave

在之前的博客,介绍了MySQL的binlog 日志,如下:

MySQL 日志系统 redo log 和 binlog 说明
https://www.cndba.cn/dave/article/4672

因为二进制日志不覆盖,是不断累积的,如果业务比较忙,那么binlog 就会占用很大的存储空间,甚至将磁盘占满,所以在启用binlog日志后,需要定期的删除binlog。

http://www.cndba.cn/cndba/dave/article/4674

1 启动清除binglog

自动清理由expire_logs_days参数控制,该参数默认为0,表示不删除:

http://www.cndba.cn/cndba/dave/article/4674
http://www.cndba.cn/cndba/dave/article/4674

mysql> show variables like '%expire_logs_days%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.00 sec)

设置自动删除10天之前的binlog:http://www.cndba.cn/cndba/dave/article/4674

mysql> set global expire_logs_days = 10;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%expire_logs_days%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 10    |
+------------------+-------+
1 row in set (0.00 sec)

mysql> show master logs;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000001 |        177 |
| mysql-bin.000002 | 1073741907 |
| mysql-bin.000003 |  553549830 |
+------------------+------------+
3 rows in set (0.06 sec)

2 手工删除binlog

手工删除要注意下MySQL的环境,如果是单机版,可以直接删除,如果是主从复制集群,那么要先查看备库日志的应用情况,在删除,避免删除之前binlog 没有应用到备库,从而导致同步异常。

在主从复制环境下可以使用如下SQL查看:

show slave status/G; #检查从服务器正在读取哪个日志,有多个从服务器,选择时间最早的一个做为目标日志。http://www.cndba.cn/cndba/dave/article/4674

然后手工删除,删除有如下几个命令:

获得主服务器上的一系列日志http://www.cndba.cn/cndba/dave/article/4674http://www.cndba.cn/cndba/dave/article/4674

mysql> show master logs;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000001 |        177 |
| mysql-bin.000002 | 1073741907 |
| mysql-bin.000003 |  553549830 |
+------------------+------------+
3 rows in set (0.06 sec)

删除mysql-bin.000002之前的,不包括mysql-bin.000002

mysql> PURGE MASTER LOGS TO 'mysql-bin.000002';
Query OK, 0 rows affected (0.03 sec)

mysql> show master logs;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000002 | 1073741907 |
| mysql-bin.000003 |  553559205 |
+------------------+------------+
2 rows in set (0.00 sec)

清除2020-06-19 00:00:00前binlog日志

mysql> PURGE MASTER LOGS BEFORE '2020-06-19 00:00:00';
Query OK, 0 rows affected (0.02 sec)

清除60天前binlog日志:

mysql> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 60 DAY); 
Query OK, 0 rows affected, 1 warning (0.28 sec)

mysql> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 60 DAY);
Query OK, 0 rows affected, 1 warning (0.00 sec)

当然,也可以配置成脚本,自动执行:

MySQL binlog 自动清理脚本
https://www.cndba.cn/dave/article/4673

http://www.cndba.cn/cndba/dave/article/4674

3 relay log日志清除

在主从复制环境下,MySQL通过binlog和relay log进行主从数据的同步,binlog由主库产生,从库通过复制io线程拉取binlog,写入到relay log中,sql线程读取relay log中的事务信息,并进行应用。

http://www.cndba.cn/cndba/dave/article/4674

relay log通常不需要人工清理,因为从库的复制线程在应用完relay log中的事务后,会自动把relay log删除。每次复制的IO线程重启,都会生成一个新的relay log,每个relay log文件的大小由参数max_relay_log_size控制,该参数默认为0,即表示其大小和binlog文件大小一致,通常也为1G。

当然在从库上也可以执行命令来清除relay log文件,比如:reset slave 和 reset slave all。这两个命令会将relay log文件全部删除,并且生成新的索引从1开始的relay log文件。http://www.cndba.cn/cndba/dave/article/4674

mysql>STOP SLAVE;
mysql>reset slave
mysql>STOP SLAVE;

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2261
    原创
  • 3
    翻译
  • 578
    转载
  • 191
    评论
  • 访问:8017369次
  • 积分:4346
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ