> 文章列表 > 清理mysql中的binlog

清理mysql中的binlog

清理mysql中的binlog

一、背景

有台机器的磁盘容量2T,数据只有不到200G,但是磁盘缺出现不足的告警。

二、现象

告警平台发出告警,数据磁盘使用量达到阈值。

三、问题排查过程

1、du查看数据盘使用情况,发现mysql磁盘基本占用了所有磁盘
2、继续使用du查看,数据目录占用不到200G,但是binlog目录却占用了1.7T
3、查看binlog的保留策略
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 7     |
+------------------+-------+
1 row in set (0.00 sec)

发现保留7天,仍然占用1.7T的日志

4、查看当前主从状态是否同步成功了

主从同步依据:

1)、2个running
-- 负责把主库bin日志(Master_Log)内容投递到从库的中继日志上(Relay_Log)
Slave_IO_Running: Yes-- 负责把中继日志上的语句在从库上执行一遍
Slave_SQL_Running: Yes-- Yes:表示正常, No:表示异常
2)、判断完全同步
* Master_Log_File 和 Relay_Master_Log_File 所指向的文件必须一致
* Relay_Log_Pos 和 Exec_Master_Log_Pos 位置也要一致才行
* Slave_SQL_Running_State: 显示为wait 中继日志的sql语句已经全部执行完毕
3)、主库查看当前binlog文件及position
mysql> show master status\\G;
* 1. row *File: mysql-bin.054419Position: 2122130Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.01 sec)
4)、从库查看同步状态
mysql> show slave status\\G
* 1. row *Slave_IO_State: Waiting for master to send eventMaster_Host: aMaster_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.054419Read_Master_Log_Pos: 2122130Relay_Log_File: mysqld-relay-bin.074569Relay_Log_Pos: 2122263Relay_Master_Log_File: mysql-bin.054419Slave_IO_Running: YesSlave_SQL_Running: Yes……非关键内容Exec_Master_Log_Pos: 2122130Relay_Log_Space: 2115345……非关键内容SQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updates……非关键内容
1 row in set (0.00 sec)

经判断,主从同步正常

5、删除旧的binlog,只保留3天

查看3天前的日志是哪个,将此文件以前的日志,都删掉

mysql>purge binary logs to 'mysql-bin.039560';

或者可以直接指定时间进行删除

mysql>purge binary logs before '2023-01-01 23:59:59';

四、原因分析

binlog日志过大,不过由于业务量多,属于正常现象。

五、解决

1、删掉binlog日志
2、在保留7天binlog的基础上,扩容1T磁盘,规避磁盘满故障风险

六、反思与规避

好记性不如赖笔头。
与君共勉。