Linux LVM 根目录 100% 磁盘打满:3步定位 MySQL 日志并安全清理

📅 2026/7/6 2:34:23 👁️ 阅读次数 📝 编程学习
Linux LVM 根目录 100% 磁盘打满:3步定位 MySQL 日志并安全清理

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 -hr

2. 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 存储优化策略

为避免再次陷入磁盘危机,建议实施以下预防措施:

  1. 监控预警配置

    # 添加磁盘监控到crontab */5 * * * * [ $(df / --output=pcent | tail -1 | tr -d '%') -gt 90 ] && alert-disk-space.sh
  2. 存储架构优化

    • 将 MySQL 数据目录迁移到独立 LVM 卷
    • /var/log创建单独分区
  3. 定期维护任务

    -- 每月初自动清理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的习惯。