mysql运行时如果提示磁盘空间不足,大概率是因为日志文件、临时文件长期未清理导致空间被占满,这类问题如果不按规范处理很容易造成数据丢失或者数据库服务异常,需要按照对应规则逐步操作。

一、先排查磁盘空间占用来源
首先不要直接删除文件,先确认mysql相关文件的实际占用情况,避免误删核心数据文件。可以通过系统命令查看磁盘整体占用,再定位mysql的数据目录。
如果是linux系统,可以用以下命令查看磁盘使用情况:
# 查看整体磁盘占用 df -h # 进入mysql数据目录,查看各文件占用大小,默认路径一般是/var/lib/mysql cd /var/lib/mysql du -sh *
通常占用空间较大的文件类型主要有binlog日志、undo日志、临时文件、慢查询日志这几类,确认类型后再针对性清理。
二、安全清理binlog日志
binlog是mysql的二进制日志,用于主从复制和数据恢复,默认不会自动清理,长期运行会占满磁盘。清理binlog有两种安全方式,不要直接删除物理文件。
1. 设置自动清理策略
可以修改mysql配置文件,设置binlog的过期时间,让mysql自动清理过期的日志:
# 在my.cnf或者my.ini的[mysqld]模块下添加以下配置,单位是天 expire_logs_days = 7 # 重启mysql服务生效
2. 手动清理过期binlog
如果当前磁盘已经满了,可以先登录mysql执行命令手动清理,比如清理7天前的binlog:
-- 查看当前所有binlog文件 SHOW BINARY LOGS; -- 清理7天前的binlog,时间可以根据实际情况调整 PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY); -- 也可以直接删除指定日志文件之前的所有日志,比如删除mysql-bin.000010之前的所有日志 PURGE BINARY LOGS TO 'mysql-bin.000010';
三、清理临时文件
mysql执行排序、分组、大表关联等操作时会产生临时文件,默认存放在tmpdir指定的目录,如果临时文件没有正常释放也会占用大量空间。
1. 查看临时文件配置
先登录mysql查看临时文件的存放路径和大小限制:
-- 查看临时文件存放目录 SHOW VARIABLES LIKE 'tmpdir'; -- 查看临时表大小限制 SHOW VARIABLES LIKE 'tmp_table_size'; SHOW VARIABLES LIKE 'max_heap_table_size';
2. 清理临时文件
如果mysql服务正常,临时文件会在查询结束后自动删除,如果服务异常终止可能会有残留。可以先停止mysql服务,再删除tmpdir目录下的mysql临时文件,注意只删除文件名以sql开头、后缀为tmp的文件,不要删除其他文件。重启服务后临时文件会重新生成。
如果是运行中需要清理,可以优化大查询,避免产生过大的临时文件,同时可以适当调大tmp_table_size参数,让更多临时操作在内存完成,减少磁盘临时文件的生成。
四、清理其他日志文件
除了binlog,慢查询日志、错误日志、undo日志也可能占用较多空间,处理方式如下:
- 慢查询日志:如果开启了慢查询日志,长期运行会积累大量内容,可以定期清空日志文件,登录mysql执行
SET GLOBAL slow_query_log = 'OFF';关闭日志,然后清空物理文件后再开启即可。 - undo日志:innodb的undo日志默认存放在数据目录,mysql 8.0以上版本可以设置innodb_undo_log_truncate参数自动收缩undo表空间,修改配置文件添加
innodb_undo_log_truncate = ON,重启服务后undo日志超过阈值会自动清理。 - 错误日志:错误日志不建议直接删除,可以定期切割日志,避免单个文件过大,linux系统可以用logrotate工具配置自动切割。
五、避免磁盘空间再次不足的优化建议
清理完成后可以做一些优化,避免问题反复出现:
- 定期监控磁盘空间,设置告警阈值,空间使用超过80%时及时处理。
- 合理设置各类日志的过期时间,不要保留过长时间的日志文件。
- 大查询尽量优化,避免产生过大的临时文件,必要时可以拆分查询。
- 数据目录单独挂载磁盘,不要和系统盘放在同一个分区,避免系统盘被占满影响服务。
注意:所有清理操作前建议先备份重要数据,尤其是手动删除物理文件时,一定要确认文件类型,不要删除ibdata、表数据文件等核心文件,否则会导致数据库无法启动。
如果按照以上步骤操作后磁盘空间仍然不足,需要排查是否有其他大文件占用,或者考虑扩容磁盘,保障mysql有足够的运行空间。