Linux LVM 磁盘空间100%排查从MySQL日志到系统大文件的精准定位当服务器突然告警磁盘空间不足MySQL服务异常中断作为运维工程师的你可能正在经历一场与时间的赛跑。本文将带你深入理解LVM磁盘空间占满的排查逻辑并提供一套可复用的三步排查法让你在紧急情况下快速定位问题根源。1. 快速诊断确认磁盘空间使用情况面对磁盘空间告警第一步永远是确认当前系统的整体存储状态。这里有几个关键命令能帮你快速建立全局认知df -hT这个命令会显示所有挂载点的使用情况重点关注/dev/mapper开头的LVM逻辑卷。输出类似Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_xxx-lv_root xfs 50G 50G 20K 100% /如果看到Use%达到100%说明该分区确实已经耗尽空间。此时需要进一步分析确认文件系统类型xfs和ext4的处理方式略有不同注意Avail列显示剩余空间可能只有几KB时服务就会异常观察Mounted on确定是哪个挂载点出问题常见的是根目录/提示在SSH会话中可以使用watch -n 5 df -h命令每5秒自动刷新磁盘状态方便观察清理效果。接下来用du命令定位具体占用大的目录du -hx --max-depth1 / | sort -h这个组合命令会-hx以人类可读格式显示且不跨越文件系统边界--max-depth1只显示一级子目录大小sort -h按人类可读的大小排序输出典型输出可能显示12K /lostfound 144M /boot 1.2G /home 4.8G /var 35G /usr2. 深度排查精准定位大文件当确定某个目录异常庞大后需要进一步定位具体文件。此时find命令是最有力的工具find /var -type f -size 500M -exec ls -lh {} | sort -k5 -h -r这个复杂命令实现了在/var目录下查找大于500MB的普通文件(-type f)-exec ls -lh {} 对找到的文件执行详细列表sort -k5 -h -r按第5列(文件大小)逆序排序对于MySQL相关的问题特别需要检查/var/lib/mysql/数据文件目录/var/log/mysql/或/var/log/mysqld.log错误日志mysql-bin.000xxx二进制日志文件如果发现是日志文件占用过大不要直接rm删除对于MySQL二进制日志正确的清理方式是-- 登录MySQL后执行 PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);或者在my.cnf中配置自动清理[mysqld] expire_logs_days 3 max_binlog_size 100M对于系统日志文件安全的处理方式是# 清空日志文件而不删除 echo /var/log/mysqld.log # 或者使用logrotate工具轮转日志 logrotate -f /etc/logrotate.d/mysql3. 进阶技巧处理特殊空间占用情况有时候常规的df和du命令显示的结果会出现矛盾 -df显示磁盘已满但du统计的各目录总和却小很多。这通常意味着存在幽灵文件占用。3.1 已删除但未释放的文件当一个文件被删除时如果仍有进程持有该文件的句柄空间就不会真正释放。使用lsof命令可以找出这些僵尸文件lsof | grep deleted | awk {print $2,$4,$7,$9} | sort -k3 -nr输出示例mysqld 500u REG 253,1 4294967296 /var/lib/mysql/ibdata1 (deleted) nginx 1234w REG 253,1 1073741824 /var/log/nginx/access.log (deleted)处理方案是重启相关服务或者更优雅地发送信号让进程重新打开日志文件# 对Nginx示例 kill -USR1 $(cat /var/run/nginx.pid)3.2 LVM空间扩展实战如果清理后空间仍然紧张考虑扩展LVM逻辑卷。完整流程如下首先确认卷组是否有剩余空间vgs如果有可用空间扩展逻辑卷lvextend -L 5G /dev/mapper/vg_xxx-lv_root最后扩展文件系统# 对于XFS文件系统 xfs_growfs / # 对于ext4文件系统 resize2fs /dev/mapper/vg_xxx-lv_root3.3 Inode耗尽问题即使磁盘空间充足大量小文件也可能耗尽inode。检查inode使用情况df -i如果发现IUse%达到100%需要清理无用的小文件或临时文件# 查找包含大量文件的目录 find / -xdev -type d | while read dir; do echo $(find $dir -maxdepth 1 | wc -l) $dir; done | sort -n | tail -104. 预防措施与自动化监控亡羊补牢不如未雨绸缪。建立预防机制比紧急处理更重要设置监控告警使用PrometheusGrafana监控磁盘空间和inode使用率日志轮转配置确保所有服务都有合理的logrotate配置定期维护脚本创建定期清理临时文件的cron任务容量规划根据业务增长预测存储需求提前扩容一个简单的磁盘监控shell脚本示例#!/bin/bash THRESHOLD90 CURRENT$(df / --outputpcent | tail -1 | tr -d % ) if [ $CURRENT -gt $THRESHOLD ]; then echo WARNING: 根分区使用率 ${CURRENT}% | mail -s 磁盘空间告警 adminexample.com # 自动触发日志清理 /usr/sbin/logrotate -f /etc/logrotate.d/nginx fi将这些实践融入日常运维工作流你就能从容应对各种磁盘空间危机确保服务持续稳定运行。记住好的运维不是会解决所有问题而是让问题没有机会发生。