Linux服务器MySQL数据文件夹占用过高,原来是binlog过多

青雨紫峰 7天前 ⋅ 65 阅读

服务器磁盘空间突然耗尽,于是开展排查。

先使用命令,查询占用磁盘空间最大的文件夹。

du -h --max-depth=1 | sort -hr | head -n 10
-h 选项表示以易读的格式(如KB、MB、GB)显示大小。

--max-depth=1 限制du命令的递归深度为1,即只查看当前目录下的直接子目录和文件。

sort -hr 对输出进行排序,-h 表示按人类可读的数字排序,-r 表示逆序(从大到小)。

head -n 10 显示前10个最大的结果。

从根目录开始排查,逐步寻到mysql数据文件夹,原来是binlog文件过多,把磁盘空间用尽了。

手动删除binlog

可以直接删除binlog文件,但是可以通过mysql提供的工具来删除更安全,因为purge会更新mysql-bin.index中的条目,而直接删除的话,mysql-bin.index文件不会更新。

mysql-bin.index的作用是加快查找binlog文件的速度。

1、首先登录的mysql

2、查看binlog 日志文件 mysql> show binary logs;

3、删除举例:

  • 清除3天前的 binlog

    PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);

  • 删除所有binlog日志,新日志编号从头开始

    RESET MASTER;

  • 删除mysql-bin.010之前所有日志

    PURGE MASTER LOGS TO ‘mysql-bin.010’;

  • 删除2003-04-02 22:46:26之前产生的所有日志

    PURGE MASTER LOGS BEFORE ‘2003-04-02 22:46:26’;

个人感觉还是最下面的好用,当执行时提示0条响应,实现是已经把3天之前的binlog文件已经删除掉了。

临时配置binlog过期

  • 查看现在配置:show variables like 'expire_logs_days';
  • 用以下命令设置全局的参数:set global expire_logs_days=30;(数字30是保留30天的意思)
  • 刷一下log使上面的设置生效,否则不生效:flush logs;

永久配置binlog过期

服务器安装的是MySQL8,编辑配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,添加binlog过期时间的配置项:expire_logs_days=7,然后重启mysql服务即可。