Linux LVM 根目录 100% 磁盘打满:3步定位 MySQL 日志并安全清理
📅 2026/7/6 2:34:23
👁️ 阅读次数
📝 编程学习
Linux LVM 根目录磁盘爆满:MySQL 日志精准定位与安全清理实战指南
当服务器突然告警磁盘空间不足,MySQL 服务异常中断,作为运维工程师的你是否曾手忙脚乱?本文将带你深入 Linux LVM 存储架构,通过一套系统化的排查流程,精准定位 MySQL 日志导致的根目录爆满问题,并提供多种安全清理方案。
1. 紧急诊断:三步定位磁盘占用元凶
面对/dev/mapper/vg_xxx-lv_root显示 100% 的危急情况,切忌盲目删除文件。我们采用分层排查法锁定问题根源:
# 第一步:确认磁盘整体状况 df -hT | grep -v tmpfs典型输出示例:
Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_xxx-lv_root ext4 50G 50G 0 100% /接下来使用进阶版du命令扫描大文件:
# 第二步:深度分析目录空间占用 du -hx --max-depth=1 / | sort -hr | head -10输出可能显示:
35G /var 12G /usr 3.5G /home当发现/var异常膨胀时,需要聚焦 MySQL 相关路径:
# 第三步:精准定位MySQL日志文件 find /var/lib/mysql -type f -size +500M -exec ls -lh {} + | sort -k5 -hr2. MySQL 日志类型深度解析
MySQL 主要产生两类可能吞噬磁盘空间的日志:
| 日志类型 | 默认路径 | 作用 | 清理风险等级 |
|---|---|---|---|
| Binary Log | /var/lib/mysql/mysql-bin.* | 主从复制和时间点恢复 | ⚠️ 高危 |
| Error Log | /var/log/mysqld.log | 记录错误和警告信息 | ⚠️ 中危 |
| Slow Query Log | /var/lib/mysql/slow.log | 记录执行缓慢的SQL | ✅ 低危 |
注意:直接删除这些日志文件可能导致MySQL服务崩溃,必须采用正确清理方式
3. Binary Log 安全清理方案对比
我们详细对比三种主流清理方法:
方案一:RESET MASTER 核武器
-- 立即清除所有binary log RESET MASTER;适用场景:
- 非主从架构的单机环境
- 确定不需要时间点恢复
- 紧急磁盘空间释放
优缺点:
- ✅ 一次性彻底清理
- ❌ 破坏时间点恢复能力
- ❌ 主从环境会导致复制中断
方案二:PURGE 精准打击
-- 清除指定日志之前的文件 PURGE MASTER LOGS TO 'mysql-bin.000015'; -- 按时间维度清理 PURGE MASTER LOGS BEFORE '2023-06-01 00:00:00';操作示例:
# 先查看现有日志列表 ls -lh /var/lib/mysql/mysql-bin.*方案三:expire_logs_days 自动维护
修改/etc/my.cnf配置文件:
[mysqld] expire_logs_days = 7 log_bin = mysql-bin生效方式:
systemctl restart mysqld三种方案对比表:
| 方案 | 自动化程度 | 精确控制 | 服务影响 | 恢复能力保持 |
|---|---|---|---|---|
| RESET MASTER | 手动 | 无 | 需重启 | 完全丧失 |
| PURGE | 手动 | 高 | 无 | 部分保持 |
| 过期设置 | 自动 | 中 | 需重启 | 完整保持 |
4. Error Log 安全处理技巧
对于持续增长的错误日志,推荐采用日志轮替机制:
# 安全清空当前日志(无需重启) > /var/log/mysqld.log # 配置logrotate(/etc/logrotate.d/mysqld) /var/log/mysqld.log { daily rotate 30 missingok compress delaycompress notifempty create 640 mysql mysql sharedscripts postrotate /usr/bin/mysqladmin flush-logs endscript }5. 高级排查:隐藏的空间杀手
有时候常规检查无法解释空间占用,可能是这些隐藏问题:
案例一:已删除但未释放的文件
lsof | grep deleted | sort -k7 -rn输出示例:
mysqld 1234 mysql 44u REG 253,1 524288000 1024 /var/lib/mysql/ibdata1 (deleted)处理方案:
# 优雅重启MySQL服务 systemctl restart mysqld案例二:Inode 耗尽
df -i /var/lib/mysql当 Inode 使用率 100% 时,即使有剩余空间也无法创建新文件。
6. 防患未然:MySQL 存储优化策略
为避免再次陷入磁盘危机,建议实施以下预防措施:
监控预警配置:
# 添加磁盘监控到crontab */5 * * * * [ $(df / --output=pcent | tail -1 | tr -d '%') -gt 90 ] && alert-disk-space.sh存储架构优化:
- 将 MySQL 数据目录迁移到独立 LVM 卷
- 为
/var/log创建单独分区
定期维护任务:
-- 每月初自动清理90天前的慢查询日志 SET GLOBAL slow_query_log = OFF; RENAME TABLE mysql.slow_log TO mysql.slow_log_archive; SET GLOBAL slow_query_log = ON;
记住,在处理生产环境磁盘空间问题时,始终遵循「检查-备份-操作-验证」的黄金流程。某次我在清理大型电商平台的MySQL日志时,就因为漏查主从复制状态,导致从库同步中断,这个教训让我养成了操作前必查SHOW SLAVE STATUS\G的习惯。
编程学习
技术分享
实战经验