1. Oracle ASM Diskgroup 扩容操作概述
作为一名Oracle DBA,存储空间管理是日常运维中最常见的工作之一。当数据库文件所在的ASM diskgroup空间不足时,我们需要及时进行扩容操作。ASM(Automatic Storage Management)是Oracle提供的存储管理解决方案,它通过diskgroup的概念简化了存储管理,支持在线扩容、自动负载均衡等特性。
ASM diskgroup扩容主要有两种方式:
- 向现有diskgroup添加新磁盘
- 创建新的diskgroup并将部分数据迁移过去
第一种方式适用于现有diskgroup空间不足但存储架构无需调整的场景,操作简单且对业务影响小。第二种方式则适用于需要隔离不同类型数据(如将归档日志分离到专用diskgroup)或存储架构发生变化的场景。
在实际操作中,我们需要特别注意以下几点:
- 扩容操作应在业务低峰期进行,避免影响生产性能
- 根据冗余级别(EXTERNAL/NORMAL/HIGH)合理规划磁盘数量
- 监控rebalance进度,控制其对系统性能的影响
- 提前做好备份和回滚方案
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与检查
2.1 切换到grid用户并连接ASM实例
ASM管理操作需要使用grid用户权限。首先切换到grid用户:
bash复制su - grid
然后连接到ASM实例:
bash复制sqlplus / as sysasm
注意:生产环境中建议使用密码文件认证而非操作系统认证,以提高安全性。可以使用
sqlplus sys/<password>@+ASM as sysasm方式连接。
2.2 检查当前ASM实例状态
连接ASM实例后,首先确认实例状态正常:
sql复制SELECT instance_name, status, version FROM v$instance;
预期输出应显示实例状态为"OPEN",版本号与当前Oracle版本一致。
2.3 检查diskgroup状态
查看所有diskgroup的空间使用情况:
sql复制SELECT name, state, type, total_mb, free_mb,
ROUND((total_mb-free_mb)/total_mb*100, 2) as used_pct
FROM v$asm_diskgroup;
重点关注:
state:应为MOUNTEDused_pct:使用率超过80%应考虑扩容type:冗余类型(EXTERNAL/NORMAL/HIGH)
查看更详细的diskgroup信息:
sql复制SELECT group_number, name, allocation_unit_size, state, type,
total_mb, free_mb, required_mirror_free_mb, usable_file_mb
FROM v$asm_diskgroup;
其中usable_file_mb表示实际可用的文件空间,考虑了冗余因素。
2.4 检查现有磁盘分布
sql复制SELECT group_number, disk_number, name, path, total_mb, free_mb,
header_status, mode_status, state
FROM v$asm_disk
ORDER BY group_number, disk_number;
重点关注:
header_status:应为MEMBER(已加入diskgroup)state:应为NORMAL(正常状态)free_mb:各磁盘剩余空间
2.5 检查磁盘发现路径
确认ASM能够发现哪些磁盘:
sql复制SELECT value FROM v$parameter WHERE name = 'asm_diskstring';
查看可被ASM发现的磁盘(包括未使用的):
sql复制SELECT path, header_status, mode_status, state
FROM v$asm_disk
WHERE header_status IN ('CANDIDATE', 'FORMER', 'MEMBER');
header_status说明:
CANDIDATE:可以被添加到diskgroup的磁盘MEMBER:已经是某个diskgroup成员的磁盘FORMER:曾经是diskgroup成员但已被删除的磁盘
3. 方案一:向现有Diskgroup添加磁盘
3.1 前置准备
3.1.1 操作系统层准备新磁盘
根据存储配置方式不同,有两种主要方法准备磁盘:
方法1:使用ASMLib(传统方式)
bash复制# 以root用户执行
oracleasm createdisk DISK5 /dev/sdc1
oracleasm createdisk DISK6 /dev/sdd1
# 扫描新磁盘
oracleasm scandisks
oracleasm listdisks
方法2:使用UDEV(推荐用于Oracle 12c及以上)
bash复制# 以root用户编辑UDEV规则文件
vi /etc/udev/rules.d/99-oracle-asmdevices.rules
# 添加规则示例:
KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="<SCSI_ID>", OWNER="grid", GROUP="asmadmin", MODE="0660"
# 重新加载udev规则
udevadm control --reload-rules
udevadm trigger
提示:使用UDEV时,确保磁盘权限正确(grid:asmadmin,0660)
3.1.2 验证磁盘可被ASM发现
sql复制-- 查看新磁盘是否可被发现
SELECT path, header_status
FROM v$asm_disk
WHERE header_status = 'CANDIDATE';
如果磁盘未显示,检查:
asm_diskstring参数是否包含磁盘路径- 磁盘权限是否正确
- 是否已执行
oracleasm scandisks或udevadm trigger
3.2 添加磁盘到现有Diskgroup
3.2.1 添加单个磁盘
基本语法:
sql复制ALTER DISKGROUP <diskgroup_name> ADD DISK '<disk_path>';
示例:向DATA diskgroup添加一个磁盘
sql复制ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5';
可选参数:
- 指定磁盘名称:
sql复制ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' NAME DISK5;
- 指定磁盘大小:
sql复制ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' SIZE 100G;
3.2.2 添加多个磁盘
同时添加多个磁盘:
sql复制ALTER DISKGROUP DATA ADD DISK
'/dev/oracleasm/disks/DISK5' NAME DISK5,
'/dev/oracleasm/disks/DISK6' NAME DISK6,
