Linux LVM 根分区 (/dev/mapper) 100% 排查:3步定位MySQL日志等大文件

📅 2026/7/6 2:19:24 👁️ 阅读次数 📝 编程学习
Linux LVM 根分区 (/dev/mapper) 100% 排查:3步定位MySQL日志等大文件

Linux LVM根分区磁盘爆满排查指南:从定位到清理的完整解决方案

当服务器突然告警磁盘空间不足时,那种紧迫感每个运维人员都深有体会。特别是当根分区(/dev/mapper/vg_xxx-lv_root)显示100%占用时,系统随时可能崩溃。本文将带你系统化解决这个问题,不仅提供应急处理方案,还会分享如何预防此类问题再次发生。

1. 快速诊断:三步定位磁盘占用元凶

遇到磁盘爆满时,盲目删除文件可能造成严重后果。我们推荐以下系统化的排查流程:

1.1 第一步:确认磁盘使用情况

首先用df命令确认问题所在分区:

df -hT

关键观察点:

  • Filesystem:确认是/dev/mapper/vg_xxx-lv_root占用100%
  • Mounted on:确认挂载点为根目录/
  • Type:了解文件系统类型(ext4/xfs),这对后续扩容很重要

典型输出示例:

Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_centos-root xfs 50G 50G 20K 100% /

1.2 第二步:定位大文件目录

使用du命令找出占用空间最大的目录:

du -hx --max-depth=1 / | sort -h

这个命令组合的巧妙之处在于:

  • -h:人类可读格式显示大小
  • -x:不跨越文件系统边界(避免统计挂载点)
  • --max-depth=1:只显示一级子目录
  • sort -h:按人类可读的大小排序

常见占用大户目录:

  • /var:日志、数据库文件
  • /usr:系统软件
  • /home:用户数据
  • /opt:第三方应用

1.3 第三步:精确查找大文件

锁定可疑目录后,使用find命令定位具体的大文件:

find /var -type f -size +500M -exec ls -lh {} \; | sort -k5 -h -r

参数解析:

  • -type f:只查找文件
  • -size +500M:大于500MB的文件
  • -exec ls -lh {} \;:显示详细信息
  • sort -k5 -h -r:按第五列(大小)逆序排序

2. 常见罪魁祸首及专业处理方案

根据多年运维经验,以下是最常见的磁盘占用元凶及其安全清理方法:

2.1 MySQL日志文件处理

MySQL相关日志通常位于/var/lib/mysql/,主要包括:

  • binlog:mysql-bin.000xxx
  • 错误日志:mysqld.log
  • 慢查询日志:slow.log

安全清理方案:

对于binlog文件,绝对不要直接rm删除!正确的做法是:

-- 登录MySQL后执行 PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00'; -- 清理指定日期前的日志 -- 或 PURGE BINARY LOGS TO 'mysql-bin.000010'; -- 清理到指定日志文件 -- 或设置自动过期(推荐) SET GLOBAL expire_logs_days = 3; -- 只保留3天日志

对于错误日志,安全的做法是清空而非删除:

> /var/log/mysqld.log # 清空日志文件

2.2 系统日志文件处理

系统日志通常位于/var/log/,常见占用空间的文件:

  • messages:系统主日志
  • secure:安全相关日志
  • audit/audit.log:审计日志

专业处理建议:

  1. 使用logrotate配置自动轮转:
cat /etc/logrotate.d/syslog

典型配置示例:

/var/log/messages { daily rotate 7 compress delaycompress missingok notifempty create 0640 root adm }
  1. 手动清理旧日志:
# 保留最近7天日志 find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;

2.3 已删除但未释放空间的文件处理

有时文件已被删除,但进程仍持有文件句柄,空间并未释放。使用lsof工具检测:

lsof | grep deleted | sort -nrk7

处理方案:

  1. 记录占用进程的PID
  2. 评估是否可以重启该进程
  3. 必要时用kill -HUP PID优雅重启进程

3. 高级排查技巧与预防措施

3.1 Inode耗尽问题排查

即使磁盘空间足够,inode耗尽也会导致"No space left"错误。检查方法:

df -i # 查看inode使用情况

解决方案:

  • 删除小文件:find / -type f -size -1k -exec rm {} \;
  • 调整文件系统inode数量(需重新格式化)

3.2 Docker磁盘空间管理

Docker会占用大量空间在:

  • /var/lib/docker/overlay2/:容器存储层
  • 未清理的镜像、容器

清理命令:

docker system prune -a # 清理所有未使用的资源 docker volume prune # 清理未使用的卷

3.3 LVM扩容终极解决方案

当清理无法解决问题时,考虑扩容LVM:

# 查看当前VG空间 vgs # 扩容物理卷 pvresize /dev/sdaX # 扩容逻辑卷 lvextend -L +10G /dev/mapper/vg_centos-root # 扩展文件系统 resize2fs /dev/mapper/vg_centos-root # 对于ext4 xfs_growfs /dev/mapper/vg_centos-root # 对于xfs

4. 长效预防机制建设

  1. 监控预警

    • 配置Prometheus监控磁盘使用率
    • 设置80%阈值告警
  2. 日志管理规范

    • 统一日志收集到ELK
    • 配置合理的logrotate策略
  3. 定期维护

    # 每周清理临时文件 find /tmp -type f -atime +7 -delete # 每月检查大文件 find / -type f -size +1G -exec ls -lh {} \;
  4. 架构优化

    • 将日志、数据分离到独立分区
    • 使用云原生存储方案动态扩容

一套完整的磁盘空间管理策略,应该像优秀的城市规划,既要解决当下的交通拥堵,也要为未来发展预留空间。通过本文介绍的系统化方法,你不仅能快速解决当前的磁盘危机,更能建立起长效预防机制,让服务器运行更加稳健可靠。