服务器LVM磁盘内部空闲空间无损扩容+挂载原理+MySQL Binlog自动清理完整实操

一、场景背景

服务器配置:CentOS 7 + LVM 架构

磁盘单块 /dev/vda 总大小 600G

分区结构:

  • /dev/vda1:1G 挂载 /boot
  • /dev/vda2:499G 划入 LVM 卷组 centos
  • 剩余约101G 空闲未分区、未分配、未使用

LVM逻辑卷分布:

  • centos-root:50G 挂载 /
  • centos-swap:7.9G 交换分区
  • centos-home:441G 挂载 /home

故障现象:
/home 被MySQL的binlog日志占满 100%,MySQL启动报错:

复制代码
OS errno 28 - No space left on device

启动瞬间直接崩溃退出。

二、核心疑问解答:已经扩容了,为什么还要做挂载/文件系统刷新?

很多人疑惑:我已经把磁盘空间分给LVM了,为什么df -h看不到空间?

1. 四层概念一定要分清

  1. 物理磁盘/dev/vda 硬件裸盘
  2. 磁盘分区/dev/vda1 /dev/vda2 /dev/vda3,把裸盘切分区块
  3. LVM卷组VG :把多个分区/磁盘打包成一个大资源池 centos
  4. LVM逻辑卷LV :从资源池划空间出来,比如 centos-home
  5. 文件系统:xfs/ext4,真正能存文件、被系统识别占用、挂载到目录

2. 扩容每一步到底干了什么

  • 新建分区vda3:把磁盘闲置101G划出一个合法分区
  • pvcreate:把分区标记为LVM物理卷,能被卷组识别
  • vgextend:把新分区加入centos资源池,卷组空闲空间变多
  • lvextend:从资源池拿空间分给 /home 逻辑卷,逻辑卷容量变大
  • xfs_growfs /home关键!把逻辑卷新增空间,刷新给文件系统,系统df -h才能识别到可用空间

3. 为什么扩容完必须"刷新文件系统/相当于重新挂载生效"

  • LVM扩容只是底层块设备变大
  • 但上层文件系统还停留在旧容量,系统内核不认新空间
  • xfs_growfs/resize2fs 就是在线扩容文件系统,让挂载点实时识别新空间
  • 不用重启、不用卸载目录,业务不中断

一句话总结:
扩LVM只是把"仓库变大",刷新文件系统才是把"货架摆好",系统才能真正用上空间。

三、完整实操:把vda闲置101G无损扩给/home(在线不重启、不丢数据)

步骤1:新建空闲分区 /dev/vda3

bash 复制代码
fdisk /dev/vda

按顺序依次输入:

  1. n 新建分区
  2. p 主分区
  3. 起始扇区、结束扇区 全部默认回车,吃满剩余所有空闲空间
  4. t 修改分区类型
  5. 输入分区编号(默认3)
  6. 输入 8e 设置为LVM类型
  7. w 保存分区表退出

步骤2:刷新分区表,无需重启

bash 复制代码
partprobe

执行 lsblk 能看到多出 /dev/vda3 约101G。

步骤3:初始化物理卷PV

bash 复制代码
pvcreate /dev/vda3

步骤4:把新分区加入centos卷组

bash 复制代码
vgextend centos /dev/vda3

执行 vgs 可看到VG空闲空间大幅增加。

步骤5:把所有空闲空间全部分配给home逻辑卷

bash 复制代码
lvextend -l +100%FREE /dev/mapper/centos-home

步骤6:在线刷新xfs文件系统(你系统默认xfs)

bash 复制代码
xfs_growfs /home

步骤7:验证扩容结果

bash 复制代码
df -h

此时 /home 容量增加100G左右,使用率下降。

四、MySQL爆满后续处理:配置Binlog自动保留7天

1. 先清理爆满的旧Binlog,立刻释放空间

bash 复制代码
cd /home/mysql1/data
rm -f binlog.*

2. 编辑MySQL配置 my.cnf

bash 复制代码
vi /etc/my.cnf

[mysqld] 节点添加:

ini 复制代码
# 自动清理7天前binlog
expire_logs_days = 7
binlog_expire_logs_seconds = 604800

604800秒 = 7天,MySQL8.0双配置兜底,永久生效。

3. 启动MySQL

bash 复制代码
cd /usr/local/mysql/bin
./mysqld_safe --user=mysql &

4. 验证binlog过期配置

登录MySQL执行:

sql 复制代码
show variables like '%expire%';

看到两个7天相关参数即配置成功,以后自动清理7天前日志,永不撑爆磁盘

五、关键知识点总结

  1. 磁盘空间四层结构:裸盘→分区→LVM卷组→逻辑卷→文件系统
  2. LVM扩容分两步:扩逻辑卷 + 扩文件系统,缺一不可
  3. xfs_growfs 适配xfs格式,resize2fs 适配ext4格式
  4. 扩容后不用改 /etc/fstab,LVM原有挂载配置自动生效
  5. MySQL磁盘爆满首选:清理binlog + 配置自动7天过期,从根源避免再次占满
  6. 所谓"还要挂载",本质是刷新文件系统让内核识别新容量,不是重新挂载目录。
相关推荐
咸鱼梦想家π1 小时前
Linux开发工具(中)
linux·运维·服务器
网络安全许木1 小时前
自学渗透测试第29天(Linux SUID/SGID基础实验)
linux·运维·服务器·web安全·渗透测试
JiaWen技术圈1 小时前
conntrack-tools 用法
linux·运维·服务器·安全·运维开发
IT界的老黄牛1 小时前
MySQL 磁盘告警 1.2TB:从衣柜原理到 gh-ost 卧底,一次释放 540GB 的实战复盘
运维·数据库·mysql
deviant-ART1 小时前
MySQL 实战:如何根据 ID 将表 B 的字段更新到表 A
数据库·mysql
ZenosDoron1 小时前
Linux/Unix 系统中用于创建链接的命令ln
linux·运维·unix
勤劳的进取家1 小时前
传输层基础
运维·开发语言·学习·php
搬码后生仔1 小时前
【navicat不安装sql server直接远程连接服务器数据库】
运维·服务器·数据库
qq_283720051 小时前
高并发场景下 Python+MySQL 性能优化最佳实践
python·mysql·性能优化