在之前的博客,介绍了MySQL的binlog 日志,如下:
MySQL 日志系统 redo log 和 binlog 说明
https://www.cndba.cn/dave/article/4672
因为二进制日志不覆盖,是不断累积的,如果业务比较忙,那么binlog 就会占用很大的存储空间,甚至将磁盘占满,所以在启用binlog日志后,需要定期的删除binlog。
1 启动清除binglog
自动清理由expire_logs_days参数控制,该参数默认为0,表示不删除:
mysql> show variables like '%expire_logs_days%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 0 |
+------------------+-------+
1 row in set (0.00 sec)
设置自动删除10天之前的binlog:
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; #检查从服务器正在读取哪个日志,有多个从服务器,选择时间最早的一个做为目标日志。
然后手工删除,删除有如下几个命令:
获得主服务器上的一系列日志
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
3 relay log日志清除
在主从复制环境下,MySQL通过binlog和relay log进行主从数据的同步,binlog由主库产生,从库通过复制io线程拉取binlog,写入到relay log中,sql线程读取relay log中的事务信息,并进行应用。
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文件。
mysql>STOP SLAVE;
mysql>reset slave
mysql>STOP SLAVE;
版权声明:本文为博主原创文章,未经博主允许不得转载。