一、Linux 磁盘扩容
1.1 扩容场景分类
┌─────────────────────────────────────────────────────────────────┐│ Linux 磁盘扩容类型 │├─────────────────────────────────────────────────────────────────┤│ ┌──────────────────┐ ┌──────────────────┐ ││ │ 方案 A: 云盘扩容 │ │ 方案 B: 新增磁盘 │ ││ │ (推荐) │ │ │ ││ │ 1. 控制台扩容 │ │ 1. 创建新云盘 │ ││ │ 2. 扩展分区 │ │ 2. 挂载到实例 │ ││ │ 3. 扩展文件系统 │ │ 3. 格式化使用 │ ││ │ │ │ │ ││ │ ✅ 在线操作 │ │ ✅ 风险较低 │ ││ └──────────────────┘ └──────────────────┘ ││ ││ ┌────────────────────┐ ┌──────────────────┐ ││ │ 方案 C: LVM 扩容 │ │ 方案 D: 新盘迁移 │ ││ │ │ │ │ ││ │ 1. 扩展 VG │ │ 1. 创建新盘 │ ││ │ 2. 扩展 LV │ │ 2. 数据迁移 │ ││ │ 3. 扩展文件系统 │ │ 3. 切换挂载点 │ ││ │ │ │ │ ││ │ ✅ 灵活管理 │ │ ✅ 最安全 │ ││ └────────────────────┘ └──────────────────┘ │└─────────────────────────────────────────────────────────────────┘
1.2 方案 A:云盘在线扩容(推荐)
1.2.1 操作流程图
┌─────────────────────────────────────────────────────────────────┐│ 云盘在线扩容完整流程 │├─────────────────────────────────────────────────────────────────┤│ ① 云平台操作 → 控制台/CLI 扩容云磁盘 ││ ↓ ││ ② 操作系统识别 → 扫描 SCSI 总线变化 ││ ↓ ││ ③ 分区扩容 → growpart 或 fdisk ││ ↓ ││ ④ 文件系统扩容 → xfs_growfs 或 resize2fs ││ ↓ ││ ⑤ 验证完成 → df -h 确认 │└─────────────────────────────────────────────────────────────────┘
1.2.2 详细操作步骤
步骤 1:云平台扩容
# 华为云 CLI 扩容云硬盘hcloud ecs disk resize --disk-id <disk-id> --size 100# 或 AWS CLIaws ec2 modify-volume --volume-id vol-xxxxx --size 100
# 查看当前磁盘信息lsblkfdisk -l# 扫描 SCSI 总线(无需重启)echo 1 > /sys/class/scsi_device/*/device/rescan# 或使用 rescan-scsi-bus.sh/usr/bin/rescan-scsi-bus.sh# 再次查看,应显示新容量lsblk
# 方法一:使用 growpart(推荐,支持在线)# 安装 growpartyum install -y cloud-utils-growpart # CentOS/RHELapt-get install -y cloud-guest-utils # Ubuntu/Debian# 扩展第 1 个分区growpart /dev/vda 1# 验证分区变化fdisk -l /dev/vda
# 首先确认文件系统类型df -T# 情况 A:XFS 文件系统(CentOS 7+ 默认)xfs_growfs /# 情况 B:EXT4 文件系统resize2fs /dev/vda1# 验证扩容结果df -h
1.3 方案 C:LVM 逻辑卷扩容
1.3.1 LVM 架构示意
┌─────────────────────────────────────────────────────────────────┐│ LVM 层次结构 │├─────────────────────────────────────────────────────────────────┤│ 物理层 ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ /dev/sda │ │ /dev/sdb │ │ /dev/sdc │ ││ │ 物理卷 PV │ │ 物理卷 PV │ │ 物理卷 PV │ ││ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ ││ └────────────────┼────────────────┘ ││ ▼ ││ 卷组层 ┌─────────────────┐ ││ │ 卷组 VG │ ││ │ vg_system │ ││ └────────┬────────┘ ││ │ ││ ▼ ││ 逻辑卷层 ┌─────────────────┐ ┌─────────────────┐ ││ │ 逻辑卷 LV │ │ 逻辑卷 LV │ ││ │ lv_root │ │ lv_home │ ││ └────────┬────────┘ └────────┬────────┘ ││ │ │ ││ ▼ ▼ ││ 文件系统层 ┌─────────────┐ ┌─────────────┐ ││ │ / │ │ /home │ ││ └─────────────┘ └─────────────┘ │└─────────────────────────────────────────────────────────────────┘
1.3.2 LVM 扩容操作
# 1. 查看当前 LVM 状态pvs # 物理卷vgs # 卷组lvs # 逻辑卷# 2. 添加新物理卷(假设新盘 /dev/sdb)pvcreate /dev/sdb# 3. 扩展卷组vgextend vg_system /dev/sdb# 4. 查看卷组可用空间vgdisplay vg_system | grep -i "free"# 5. 扩展逻辑卷lvextend -L +50G /dev/vg_system/lv_root# 或扩展到卷组所有可用空间lvextend -l +100%FREE /dev/vg_system/lv_root# 6. 扩展文件系统# XFSxfs_growfs /# EXT4resize2fs /dev/vg_system/lv_root# 7. 验证df -hlvs
二、Linux 磁盘缩容
2.1 缩容风险提示
┌─────────────────────────────────────────────────────────────────┐│ ⚠️ ⚠️ ⚠️ 高风险操作警告 ⚠️ ⚠️ ⚠️ │├─────────────────────────────────────────────────────────────────┤│ 缩容操作存在数据丢失风险! ││ ││ 必须遵守的原则: ││ 1. ✅ 操作前完整备份数据 ││ 2. ✅ 在测试环境验证操作流程 ││ 3. ✅ 选择业务低峰期执行 ││ 4. ✅ 确保有足够的可用空间 ││ 5. ✅ XFS 文件系统不支持缩容!如需缩容必须重建 │└─────────────────────────────────────────────────────────────────┘
2.2 EXT4 文件系统缩容
2.2.1 缩容操作流程
# 场景:将 100G EXT4 分区缩小到 50G# 1. 备份数据(必须!)rsync -avz /data /backup/data_backup_$(date +%Y%m%d)# 2. 卸载文件系统umount /data# 3. 文件系统检查(必须卸载状态)e2fsck -f /dev/vdb1# 4. 缩小文件系统(先缩小文件系统,再缩小分区)resize2fs /dev/vdb1 45G# 5. 缩小分区(使用 fdisk)fdisk /dev/vdb# 命令序列:d(删除) → n(新建) → p(主) → 1(分区号) → 起始扇区(同原) → +45G → w(写入)# 6. 刷新分区表partprobe /dev/vdb# 7. 重新挂载mount /dev/vdb1 /data# 8. 验证df -hlsblk
2.3 LVM 逻辑卷缩容
# 场景:将 LVM 逻辑卷从 100G 缩小到 50G# 1. 查看当前状态lvdisplay /dev/vg_system/lv_datadf -h /data# 2. 备份数据rsync -avz /data /backup/lv_data_backup# 3. 卸载umount /data# 4. 文件系统检查e2fsck -f /dev/vg_system/lv_data# 5. 缩小文件系统(先 FS,后 LV!顺序不能错!)resize2fs /dev/vg_system/lv_data 45G# 6. 缩小逻辑卷lvreduce -L 45G /dev/vg_system/lv_data# 确认提示时输入 y# 7. 再次检查文件系统e2fsck -f /dev/vg_system/lv_data# 8. 重新挂载mount /dev/vg_system/lv_data /data# 9. 验证lvdisplay /dev/vg_system/lv_datadf -h /data
三、Oracle 数据库磁盘扩容
3.1 Oracle 存储架构
┌─────────────────────────────────────────────────────────────────┐│ Oracle 存储架构层次 │├─────────────────────────────────────────────────────────────────┤│ 数据库层 ││ ┌─────────────────────────────────────────────────────────┐ ││ │ 表空间 (Tablespace) │ ││ │ SYSTEM │ USERS │ UNDOTBS1 │ TEMP │ SYSAUX │ ││ └─────────┴─────────┴────────────┴────────┴───────────────┘ ││ │ ││ ▼ ││ 数据文件层 ││ ┌───────────┐ ┌───────────┐ ┌───────────┐ ││ │system01.dbf│ │users01.dbf│ │undotbs01.dbf│ ││ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ ││ │ │ │ ││ ▼ ▼ ▼ ││ 操作系统层 ││ ┌─────────────────────────────────────────────────────────┐ ││ │ 文件系统 / ASM 磁盘组 │ ││ │ /u01/app/oracle/oradata/ORCL/ │ ││ └─────────────────────────────────────────────────────────┘ │└─────────────────────────────────────────────────────────────────┘
3.2 方案 A:向表空间添加数据文件
-- 1. 查看表空间使用情况SELECT tablespace_name, SUM(bytes)/1024/1024 AS "Size(MB)", SUM(maxbytes)/1024/1024 AS "MaxSize(MB)"FROM dba_data_filesGROUP BY tablespace_name;-- 2. 查看表空间数据文件SELECT file_name, tablespace_name, bytes/1024/1024 AS "Size(MB)", autoextensibleFROM dba_data_filesWHERE tablespace_name = 'USERS';-- 3. 添加新数据文件ALTER TABLESPACE USERS ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;-- 4. 验证SELECT file_name, tablespace_name, bytes/1024/1024 AS "Size(MB)"FROM dba_data_filesWHERE tablespace_name = 'USERS';
3.3 方案 B:扩展现有数据文件
-- 方法 1:手动指定新大小ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' RESIZE 2G;-- 方法 2:启用自动扩展ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 10G;-- 方法 3:修改现有自动扩展设置ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' AUTOEXTEND ON NEXT 200M MAXSIZE UNLIMITED;-- 验证SELECT file_name, bytes/1024/1024 AS "Current(MB)", maxbytes/1024/1024 AS "Max(MB)", autoextensibleFROM dba_data_files;
3.4 方案 C:ASM 磁盘组扩容
-- 1. 查看磁盘组状态SELECT name, state, total_mb, free_mb, (free_mb/total_mb)*100 AS "Free%"FROM v$asm_diskgroup;-- 2. 查看磁盘组成员SELECT group_number, disk_number, name, path, total_mb, free_mbFROM v$asm_disk;-- 3. 添加新磁盘到磁盘组ALTER DISKGROUP DATA ADD DISK '/dev/sdh1';-- 4. 监控再平衡进度SELECT operation, state, power, actual_power, sofar, est_minutesFROM v$asm_operation;-- 5. 验证SELECT name, total_mb, free_mb FROM v$asm_diskgroup;
四、Oracle 数据库磁盘缩容
4.1 缩容方案对比
| 方案 | 适用场景 | 风险 | 停机时间 |
|---|
| 删除数据文件 | 表空间有多个文件 | 中 | 短 |
| 重建表空间 | 单个大文件 | 高 | 长 |
| 数据泵导出导入 | 跨平台/版本 | 低 | 长 |
4.2 删除数据文件
-- 前提:表空间有多个数据文件,且目标文件为空或数据已迁移-- 1. 查看表空间文件分布SELECT file_name, bytes/1024/1024 AS "Size(MB)", tablespace_nameFROM dba_data_filesWHERE tablespace_name = 'USERS';-- 2. 查看文件使用情况SELECT file_id, tablespace_name, bytes/1024/1024 AS "Used(MB)"FROM dba_extentsWHERE file_id = <目标文件 ID>;-- 3. 迁移数据(如果有)ALTER TABLE table_name MOVE TABLESPACE users_temp;-- 4. 删除数据文件ALTER TABLESPACE USERS DROP DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf';-- 5. 操作系统层面删除文件-- !rm /u01/app/oracle/oradata/ORCL/users02.dbf
4.3 重建表空间缩容
-- 1. 创建临时表空间CREATE TABLESPACE users_temp DATAFILE '/u01/app/oracle/oradata/ORCL/users_temp01.dbf' SIZE 500M AUTOEXTEND ON;-- 2. 迁移对象ALTER TABLE table_name MOVE TABLESPACE users_temp;ALTER INDEX index_name REBUILD TABLESPACE users_temp;-- 3. 删除原表空间DROP TABLESPACE USERS INCLUDING CONTENTS AND DATAFILES;-- 4. 重建表空间(缩小后)CREATE TABLESPACE USERS DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M AUTOEXTEND ON;-- 5. 迁移回对象ALTER TABLE table_name MOVE TABLESPACE USERS;ALTER INDEX index_name REBUILD TABLESPACE USERS;-- 6. 删除临时表空间DROP TABLESPACE users_temp INCLUDING CONTENTS AND DATAFILES;
五、故障排查与常见问题
5.1 Linux 磁盘扩容问题
| 问题 | 原因 | 解决方案 |
|---|
| growpart 失败 | 分区表损坏 | 使用 fdisk 手动调整 |
| xfs_growfs 失败 | 非 XFS 文件系统 | 确认文件系统类型 |
| 扩容后容量未变 | 未刷新分区表 | partprobe 或重启 |
| LVM 无法扩展 | VG 空间不足 | 添加新 PV 或清理 |
5.2 Oracle 扩容问题
| 问题 | 原因 | 解决方案 |
|---|
| ORA-01114 | 文件被占用 | 检查进程,必要时重启 |
| ORA-01653 | 无法扩展段 | 检查表空间配额 |
| ASM 再平衡慢 | 磁盘 IO 瓶颈 | 调整 ASM_POWER_LIMIT |
| 空间未释放 | 段未回收 | 执行 SHRINK SPACE |
5.3 排查命令速查
# Linux 磁盘状态lsblkdf -hfdisk -l# LVM 状态pvs; vgs; lvs# 文件系统状态xfs_info /dumpe2fs -h /dev/sda1# Oracle 表空间SELECT tablespace_name, SUM(bytes)/1024/1024 AS MB FROM dba_data_files GROUP BY tablespace_name;# Oracle 数据文件SELECT file_name, bytes/1024/1024 AS MB, autoextensible FROM dba_data_files;
六、最佳实践与注意事项
6.1 扩容最佳实践
┌─────────────────────────────────────────────────────────────────┐│ 扩容操作检查清单 │├─────────────────────────────────────────────────────────────────┤│ □ 1. 操作前完整备份数据 ││ □ 2. 在测试环境验证操作流程 ││ □ 3. 选择业务低峰期执行 ││ □ 4. 通知相关干系人 ││ □ 5. 准备回滚方案 ││ □ 6. 执行后验证服务和数据 ││ □ 7. 更新文档和监控阈值 │└─────────────────────────────────────────────────────────────────┘
6.2 监控建议
# 磁盘使用率告警阈值WARNING: >70%CRITICAL: >85%EMERGENCY: >95%# 配置监控脚本cat > /etc/cron.hourly/disk_check.sh << 'EOF'#!/bin/bashTHRESHOLD=85USAGE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')if [ $USAGE -gt $THRESHOLD ]; then echo "磁盘使用率告警:${USAGE}%" | mail -s "Disk Alert" admin@example.comfiEOFchmod +x /etc/cron.hourly/disk_check.sh
6.3 文档记录
每次扩容/缩容操作后,更新以下信息:
操作时间和人员
变更前容量
变更后容量
操作步骤摘要
遇到的问题及解决
验证结果