清理 MySQL 的 binlog

时间:2022-12-01 18:13:51

背景

k8s上部署一主两从mysql集群架构,使用动态持久卷各分配100G卷空间。MySQL版本使用8.0.26。binlog日志并没有做限制。

上线一段时间后,通过查看卷空间发现mysql binlog目录满了,数据库处于lock状态已无法正常响应了。

处理流程

最初登录进数据库,想通过purge命令清理不行,此时数据库已经hang住。通过mysql 命令清除日志不行,尝试通过系统命令先把几个binlog 日志mv 到/tmp目录下面。

mv /var/lib/mysql/mysql-0-bin.000078 /tmp

此时发现,系统已经释放出1G的空间。再次登录数据库执行purge命令清理。

手动清除binlog文件

# 登录mysql数据库
mysql -u root -p
# 查看当前bin log
show master logs;
# 每个mysql节点都要执行下
# 删除10天前的MySQL binlog日志
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
# 再次查看bin log
show master logs;

也可以重置master,删除所有binlog文件:

mysql -u root -p
# 谨慎操作
reset master;

配置自动清理

# 只保留7天内的 binlog 文件
mysql> set global binlog_expire_logs_seconds=60*60*168;

操作说明

  • 操作前最好备份数据库
  • 不推荐直接在/var/lib/mysql路径下,将binlog.0*删除掉,因为手动删除并不会更新binlog.index,而 binlog.index 的作用是加快查找 binlog 文件的速度。

参考文档