1. Oracle ASM Diskgroup 扩容操作概述
作为一名Oracle DBA,存储空间管理是日常运维中最常见的工作之一。当数据库文件所在的ASM diskgroup空间不足时,我们需要及时进行扩容操作。ASM(Automatic Storage Management)是Oracle提供的存储管理解决方案,它通过diskgroup的概念简化了存储管理,支持在线扩容、自动负载均衡等特性。
ASM diskgroup扩容主要有两种方式:
- 向现有diskgroup添加新磁盘
- 创建新的diskgroup并将部分数据迁移过去
第一种方式适用于现有diskgroup空间不足但存储架构无需调整的场景,操作简单且对业务影响小。第二种方式则适用于需要隔离不同类型数据(如将归档日志分离到专用diskgroup)或存储架构发生变化的场景。
在实际操作中,我们需要特别注意以下几点:
- 扩容操作应在业务低峰期进行,避免影响生产性能
- 根据冗余级别(EXTERNAL/NORMAL/HIGH)合理规划磁盘数量
- 监控rebalance进度,控制其对系统性能的影响
- 提前做好备份和回滚方案
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,
'/dev/oracleasm/disks/DISK7' NAME DISK7;
使用通配符批量添加(需确保只匹配预期磁盘):
sql复制ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK*';
3.2.3 控制Rebalance行为
添加磁盘会触发rebalance操作,可以控制其行为:
添加磁盘但不立即rebalance:
sql复制ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' NOCHECK;
稍后手动触发rebalance:
sql复制ALTER DISKGROUP DATA REBALANCE;
指定rebalance power(1-11,默认值由asm_power_limit参数控制):
sql复制ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' REBALANCE POWER 5;
修改默认rebalance power:
sql复制ALTER SYSTEM SET asm_power_limit = 8;
注意:rebalance power越高,操作越快但对系统性能影响越大。生产环境建议使用3-5。
3.3 监控Rebalance进度
查看正在进行的rebalance操作:
sql复制SELECT group_number, operation, state, power,
actual, sofar, est_work, est_rate, est_minutes
FROM v$asm_operation;
详细的rebalance进度:
sql复制SELECT group_number, operation, state, power, actual, sofar, est_work,
ROUND(sofar/est_work*100, 2) as pct_done,
est_minutes as est_min_remaining
FROM v$asm_operation
WHERE operation = 'REBAL';
持续监控(每10秒刷新一次):
sql复制SELECT TO_CHAR(SYSDATE, 'HH24:MI:SS') as time,
group_number, operation, state, power,
ROUND(sofar/est_work*100, 2) as pct_done,
est_minutes
FROM v$asm_operation
WHERE operation = 'REBAL';
-- 执行后等待10秒,重复执行查看进度
3.4 验证磁盘添加成功
检查新磁盘状态:
sql复制SELECT group_number, name, path, total_mb, free_mb, state, mode_status
FROM v$asm_disk
WHERE name IN ('DISK5', 'DISK6', 'DISK7');
检查diskgroup总容量变化:
sql复制SELECT name, state, total_mb, free_mb,
ROUND(free_mb/total_mb*100, 2) as free_pct
FROM v$asm_diskgroup
WHERE name = 'DATA';
检查磁盘均衡性(各磁盘使用率应该接近):
sql复制SELECT d.name as diskgroup, dk.name as disk,
dk.total_mb, dk.free_mb,
ROUND((dk.total_mb-dk.free_mb)/dk.total_mb*100, 2) as used_pct
FROM v$asm_diskgroup d, v$asm_disk dk
WHERE d.group_number = dk.group_number
AND d.name = 'DATA'
ORDER BY d.name, dk.name;
4. 方案二:创建新的Diskgroup
4.1 前置准备
参考3.1节准备新磁盘,确保磁盘状态为CANDIDATE。
4.2 创建Diskgroup
4.2.1 基本语法
sql复制CREATE DISKGROUP <diskgroup_name>
[EXTERNAL | NORMAL | HIGH] REDUNDANCY
DISK '<disk_path1>' [NAME <disk_name1>] [SIZE <size>],
'<disk_path2>' [NAME <disk_name2>] [SIZE <size>],
...
[ATTRIBUTE '<attribute_name>' = '<value>'];
冗余级别说明:
EXTERNAL:外部冗余(不做镜像,依赖存储设备自身冗余),至少需要1个磁盘NORMAL:正常冗余(双向镜像),至少需要2个failure groupHIGH:高冗余(三向镜像),至少需要3个failure group
4.2.2 创建EXTERNAL冗余Diskgroup
示例:创建名为FRA的外部冗余diskgroup
sql复制CREATE DISKGROUP FRA EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA1' NAME FRA1,
'/dev/oracleasm/disks/FRA2' NAME FRA2,
'/dev/oracleasm/disks/FRA3' NAME FRA3;
使用通配符:
sql复制CREATE DISKGROUP FRA EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA*';
4.2.3 创建NORMAL冗余Diskgroup(推荐)
不指定failure group(ASM自动分配):
sql复制CREATE DISKGROUP DATA NORMAL REDUNDANCY
DISK '/dev/oracleasm/disks/DATA1' NAME DATA1,
'/dev/oracleasm/disks/DATA2' NAME DATA2,
'/dev/oracleasm/disks/DATA3' NAME DATA3,
'/dev/oracleasm/disks/DATA4' NAME DATA4;
手动指定failure group(推荐,用于跨存储控制器或机柜):
sql复制CREATE DISKGROUP DATA NORMAL REDUNDANCY
FAILGROUP FG1 DISK
'/dev/oracleasm/disks/DATA1' NAME DATA1,
'/dev/oracleasm/disks/DATA2' NAME DATA2
FAILGROUP FG2 DISK
'/dev/oracleasm/disks/DATA3' NAME DATA3,
'/dev/oracleasm/disks/DATA4' NAME DATA4;
4.2.4 创建HIGH冗余Diskgroup
至少需要3个failure group:
sql复制CREATE DISKGROUP CRITICAL HIGH REDUNDANCY
FAILGROUP FG1 DISK
'/dev/oracleasm/disks/CRIT1' NAME CRIT1,
'/dev/oracleasm/disks/CRIT2' NAME CRIT2
FAILGROUP FG2 DISK
'/dev/oracleasm/disks/CRIT3' NAME CRIT3,
'/dev/oracleasm/disks/CRIT4' NAME CRIT4
FAILGROUP FG3 DISK
'/dev/oracleasm/disks/CRIT5' NAME CRIT5,
'/dev/oracleasm/disks/CRIT6' NAME CRIT6;
4.2.5 设置Diskgroup属性
创建时指定属性:
sql复制CREATE DISKGROUP DATA NORMAL REDUNDANCY
DISK '/dev/oracleasm/disks/DATA*'
ATTRIBUTE 'compatible.asm' = '12.1.0.0',
'compatible.rdbms' = '12.1.0.0',
'au_size' = '4M';
创建后修改属性:
sql复制ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.asm' = '12.2.0.0';
ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '12.2.0.0';
常用属性:
au_size:Allocation Unit大小(1M、2M、4M、8M、16M、32M、64M),创建后不可修改compatible.asm:ASM兼容性版本compatible.rdbms:数据库兼容性版本disk_repair_time:磁盘离线后自动drop前的等待时间(默认3.6小时)
4.3 挂载和卸载Diskgroup
挂载diskgroup:
sql复制ALTER DISKGROUP FRA MOUNT;
卸载diskgroup:
sql复制ALTER DISKGROUP FRA DISMOUNT;
强制卸载(有文件打开时使用,慎用):
sql复制ALTER DISKGROUP FRA DISMOUNT FORCE;
查看diskgroup挂载状态:
sql复制SELECT name, state, type FROM v$asm_diskgroup;
4.4 验证Diskgroup创建成功
查看新diskgroup信息:
sql复制SELECT name, state, type, total_mb, free_mb, usable_file_mb,
offline_disks, required_mirror_free_mb
FROM v$asm_diskgroup
WHERE name = 'FRA';
查看diskgroup中的磁盘:
sql复制SELECT group_number, disk_number, name, path,
failgroup, total_mb, free_mb, state
FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'FRA')
ORDER BY failgroup, disk_number;
查看diskgroup属性:
sql复制SELECT group_number, name, value
FROM v$asm_attribute
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'FRA'))
ORDER BY name;
5. 完整操作示例
5.1 示例1:向现有DATA diskgroup添加2个磁盘
bash复制# 1. 以root用户准备磁盘(使用ASMLib)
su - root
oracleasm createdisk NEWDISK1 /dev/sde1
oracleasm createdisk NEWDISK2 /dev/sdf1
oracleasm scandisks
# 2. 切换到grid用户
su - grid
# 3. 连接ASM实例
sqlplus / as sysasm
sql复制-- 4. 检查磁盘可被发现
SELECT path, header_status FROM v$asm_disk WHERE header_status = 'CANDIDATE';
-- 5. 查看当前diskgroup状态
SELECT name, total_mb, free_mb FROM v$asm_diskgroup WHERE name = 'DATA';
-- 6. 添加磁盘(使用较低的rebalance power避免影响性能)
ALTER DISKGROUP DATA ADD DISK
'/dev/oracleasm/disks/NEWDISK1' NAME NEWDISK1,
'/dev/oracleasm/disks/NEWDISK2' NAME NEWDISK2
REBALANCE POWER 3;
-- 7. 监控rebalance进度
SELECT operation, state, power, ROUND(sofar/est_work*100, 2) as pct_done, est_minutes
FROM v$asm_operation;
-- 8. 等待rebalance完成(state变为空,表示已完成)
-- 重复执行上面的查询,直到没有返回行
-- 9. 验证磁盘添加成功
SELECT name, total_mb, free_mb FROM v$asm_diskgroup WHERE name = 'DATA';
SELECT name, path, total_mb, state FROM v$asm_disk
WHERE name IN ('NEWDISK1', 'NEWDISK2');
5.2 示例2:创建新的FRA diskgroup(EXTERNAL冗余)
bash复制# 1. 以root用户准备磁盘
su - root
oracleasm createdisk FRA1 /dev/sdg1
oracleasm createdisk FRA2 /dev/sdh1
oracleasm createdisk FRA3 /dev/sdi1
oracleasm scandisks
# 2. 切换到grid用户
su - grid
sqlplus / as sysasm
sql复制-- 3. 检查磁盘可被发现
SELECT path, header_status FROM v$asm_disk WHERE header_status = 'CANDIDATE';
-- 4. 创建diskgroup
CREATE DISKGROUP FRA EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA1' NAME FRA1,
'/dev/oracleasm/disks/FRA2' NAME FRA2,
'/dev/oracleasm/disks/FRA3' NAME FRA3
ATTRIBUTE 'compatible.asm' = '12.1.0.0',
'compatible.rdbms' = '12.1.0.0';
-- 5. 验证创建成功
SELECT name, state, type, total_mb, free_mb FROM v$asm_diskgroup WHERE name = 'FRA';
-- 6. 查看磁盘分布
SELECT name, path, total_mb, free_mb, state FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'FRA');
5.3 示例3:创建NORMAL冗余的DATADG diskgroup(指定failure group)
bash复制# 1. 准备磁盘(假设已完成)
su - grid
sqlplus / as sysasm
sql复制-- 2. 创建带failure group的diskgroup
CREATE DISKGROUP DATADG NORMAL REDUNDANCY
FAILGROUP CONTROLLER1 DISK
'/dev/oracleasm/disks/DATADG1' NAME DATADG1 SIZE 200G,
'/dev/oracleasm/disks/DATADG2' NAME DATADG2 SIZE 200G
FAILGROUP CONTROLLER2 DISK
'/dev/oracleasm/disks/DATADG3' NAME DATADG3 SIZE 200G,
'/dev/oracleasm/disks/DATADG4' NAME DATADG4 SIZE 200G
ATTRIBUTE 'compatible.asm' = '12.2.0.0',
'compatible.rdbms' = '12.2.0.0',
'au_size' = '4M';
-- 3. 验证failure group配置
SELECT d.name as diskgroup, dk.failgroup, dk.name as disk, dk.total_mb
FROM v$asm_diskgroup d, v$asm_disk dk
WHERE d.group_number = dk.group_number
AND d.name = 'DATADG'
ORDER BY dk.failgroup, dk.name;
6. 常见管理操作
6.1 删除磁盘
从diskgroup中删除磁盘(会触发rebalance):
sql复制ALTER DISKGROUP DATA DROP DISK DISK5;
删除多个磁盘:
sql复制ALTER DISKGROUP DATA DROP DISK DISK5, DISK6;
强制删除(慎用):
sql复制ALTER DISKGROUP DATA DROP DISK DISK5 FORCE;
6.2 调整Rebalance Power
查看当前rebalance power:
sql复制SHOW PARAMETER asm_power_limit;
动态调整正在进行的rebalance的power:
sql复制ALTER DISKGROUP DATA REBALANCE POWER 8;
修改系统默认值:
sql复制ALTER SYSTEM SET asm_power_limit = 6;
6.3 删除Diskgroup
删除diskgroup(必须先卸载):
sql复制ALTER DISKGROUP FRA DISMOUNT;
DROP DISKGROUP FRA;
删除diskgroup及其所有文件(慎用!):
sql复制DROP DISKGROUP FRA INCLUDING CONTENTS;
强制删除(即使有文件也删除,极度危险!):
sql复制DROP DISKGROUP FRA FORCE INCLUDING CONTENTS;
6.4 检查和修复
检查diskgroup一致性:
sql复制ALTER DISKGROUP DATA CHECK ALL;
检查特定磁盘:
sql复制ALTER DISKGROUP DATA CHECK DISK DISK5;
修复diskgroup(通常在检查发现问题后执行):
sql复制ALTER DISKGROUP DATA MOUNT FORCE;
7. 监控和诊断SQL
7.1 容量监控
各diskgroup容量概览:
sql复制SELECT name, state, type,
ROUND(total_mb/1024, 2) as total_gb,
ROUND(free_mb/1024, 2) as free_gb,
ROUND((total_mb-free_mb)/total_mb*100, 2) as used_pct,
ROUND(usable_file_mb/1024, 2) as usable_gb
FROM v$asm_diskgroup
ORDER BY name;
磁盘级别容量分布:
sql复制SELECT dg.name as diskgroup, d.name as disk, d.path,
ROUND(d.total_mb/1024, 2) as total_gb,
ROUND(d.free_mb/1024, 2) as free_gb,
ROUND((d.total_mb-d.free_mb)/d.total_mb*100, 2) as used_pct
FROM v$asm_diskgroup dg, v$asm_disk d
WHERE dg.group_number = d.group_number
ORDER BY dg.name, d.name;
7.2 性能监控
磁盘I/O统计:
sql复制SELECT dg.name as diskgroup, d.name as disk,
d.reads, d.writes,
ROUND(d.read_time/d.reads, 2) as avg_read_ms,
ROUND(d.write_time/d.writes, 2) as avg_write_ms
FROM v$asm_diskgroup dg, v$asm_disk_stat d
WHERE dg.group_number = d.group_number
AND d.reads > 0
ORDER BY dg.name, d.name;
当前操作统计:
sql复制SELECT group_number, operation, state, power, sofar, est_work,
ROUND(sofar/est_work*100, 2) as pct_done
FROM v$asm_operation;
7.3 健康检查
检查磁盘状态(应该全部为NORMAL):
sql复制SELECT dg.name as diskgroup, d.name as disk, d.path,
d.mode_status, d.state, d.header_status
FROM v$asm_diskgroup dg, v$asm_disk d
WHERE dg.group_number = d.group_number
AND d.state != 'NORMAL';
检查diskgroup状态(应该全部为MOUNTED):
sql复制SELECT name, state, type, offline_disks
FROM v$asm_diskgroup
WHERE state != 'MOUNTED' OR offline_disks > 0;
8. 注意事项和最佳实践
8.1 容量规划
- NORMAL冗余:可用空间约为总空间的50%(双向镜像)
- HIGH冗余:可用空间约为总空间的33%(三向镜像)
- EXTERNAL冗余:可用空间约为总空间的100%(无镜像)
- 建议diskgroup使用率不超过80%,预留空间用于rebalance和故障恢复
8.2 Rebalance性能
asm_power_limit参数范围:0-11(0表示禁用自动rebalance)- 生产环境建议值:2-5(避免影响业务性能)
- 维护窗口建议值:8-11(快速完成rebalance)
- Rebalance期间可能会增加I/O负载和CPU使用率
8.3 磁盘准备
- 确保磁盘权限正确:
chown grid:asmadmin,权限0660 - 推荐使用UDEV而非ASMLib(Oracle 12c及以上)
- 磁盘路径应该是原始设备(raw device)或块设备,不要使用文件系统
8.4 Failure Group规划
- NORMAL冗余:至少2个failure group,建议将不同failure group的磁盘放在不同存储控制器上
- HIGH冗余:至少3个failure group
- Failure group应该基于物理故障域(存储控制器、机柜、电源)
8.5 兼容性设置
compatible.asm和compatible.rdbms一旦提升,不可降级- 提升兼容性前务必确认所有节点版本一致
- 建议保持与当前ASM版本一致,除非需要使用新特性
8.6 备份建议
- 扩容前备份当前配置:
sql复制SELECT * FROM v$asm_diskgroup;
SELECT * FROM v$asm_disk;
SELECT * FROM v$asm_attribute;
- 对于生产环境,建议在维护窗口执行扩容操作
- 确保有数据库备份(RMAN备份)
9. 回滚方案
9.1 添加磁盘失败回滚
如果添加磁盘命令失败,ASM会自动回滚。可以查看alert log确认:
bash复制# 路径:$ORACLE_BASE/diag/asm/+asm/<instance_name>/trace/alert_<instance_name>.log
如果磁盘已添加但需要移除:
sql复制ALTER DISKGROUP DATA DROP DISK <disk_name>;
9.2 创建Diskgroup失败回滚
创建失败通常会自动清理,如果diskgroup处于异常状态:
sql复制ALTER DISKGROUP <diskgroup_name> DISMOUNT FORCE;
DROP DISKGROUP <diskgroup_name> FORCE INCLUDING CONTENTS;
清理磁盘头信息(使用dd命令,慎用!):
bash复制# 在Linux上以root用户执行:
dd if=/dev/zero of=/dev/sdx bs=1M count=100
9.3 Rebalance中断处理
检查rebalance状态:
sql复制SELECT * FROM v$asm_operation;
如果需要停止rebalance(会在下次操作时自动继续):
sql复制ALTER DISKGROUP DATA REBALANCE POWER 1;
如果ASM实例重启,rebalance会自动恢复。
10. 故障处理
10.1 磁盘添加失败
可能原因:
- 磁盘未被ASM发现(检查asm_diskstring参数)
- 磁盘权限不正确
- 磁盘已被其他diskgroup使用
- 磁盘有文件系统或分区表
诊断步骤:
sql复制-- 检查磁盘是否可被发现
SELECT path, header_status FROM v$asm_disk WHERE path LIKE '%磁盘路径%';
-- 检查ASM alert log
-- $ORACLE_BASE/diag/asm/+asm/<instance_name>/trace/alert_<instance_name>.log
10.2 Rebalance长时间未完成
可能原因:
- Power设置过低
- 系统I/O负载高
- 磁盘性能问题
解决方法:
sql复制-- 提高rebalance power
ALTER DISKGROUP DATA REBALANCE POWER 8;
-- 检查I/O瓶颈
SELECT * FROM v$asm_disk_stat WHERE reads > 0;
10.3 Diskgroup空间不足
sql复制-- 检查空间使用情况
SELECT name, total_mb, free_mb, usable_file_mb,
ROUND(free_mb/total_mb*100, 2) as free_pct
FROM v$asm_diskgroup;
-- 临时解决:删除旧备份或归档日志
-- 长期解决:添加更多磁盘
11. 参考信息
11.1 相关视图
v$asm_diskgroup- Diskgroup信息v$asm_disk- 磁盘信息v$asm_disk_stat- 磁盘性能统计v$asm_operation- 当前操作(rebalance等)v$asm_attribute- Diskgroup属性v$asm_client- 使用ASM的数据库实例v$asm_file- ASM文件信息v$asm_template- ASM模板
11.2 重要参数
asm_diskstring- 磁盘发现路径asm_power_limit- Rebalance默认power(1-11)asm_diskgroups- 实例启动时自动挂载的diskgroup列表
11.3 常用命令速查
sql复制-- 查看所有diskgroup
SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup;
-- 查看所有磁盘
SELECT name, path, total_mb, state FROM v$asm_disk WHERE header_status = 'MEMBER';
-- 添加磁盘
ALTER DISKGROUP <dg> ADD DISK '<path>' NAME <name>;
-- 删除磁盘
ALTER DISKGROUP <dg> DROP DISK <disk_name>;
-- 挂载/卸载
ALTER DISKGROUP <dg> MOUNT;
ALTER DISKGROUP <dg> DISMOUNT;
-- 监控rebalance
SELECT operation, state, ROUND(sofar/est_work*100,2) as pct FROM v$asm_operation;
在实际操作中,我发现以下几点特别重要:
- 扩容前务必检查磁盘路径和权限,这是最常见的失败原因
- 对于生产环境,建议先在测试环境验证操作步骤
- rebalance操作对系统性能有影响,应在业务低峰期进行
- 保持ASM和数据库版本兼容性,避免因版本问题导致扩容失败
- 定期检查diskgroup空间使用情况,提前规划扩容,避免空间耗尽导致业务中断