ASM磁盘组必须在Grid安装前创建,否则Grid启动时ASM实例无法识别磁盘;需确保共享磁盘可见、权限一致、分区类型正确(8e或fd),优先使用AFD而非oracleasm;冗余模式按OCR(NORMAL/HIGH)、DATA(EXTERNAL/LOW/NORMAL/HIGH)、RECO(同DATA)选择;AFD启用后须用afda register注册分区并验证软链;静默建库必须指定au_size=4M、compatible.asm/rdbms=19.0及FAILGROUP。

ASM磁盘组必须在Grid安装前创建好
Oracle 19c ASM不是装完数据库再配的“插件”,而是Grid Infrastructure启动后立即依赖的底层存储层。如果先装Grid再建磁盘组,asmca可能无法识别裸设备,或crsctl start crs卡在ASM实例启动阶段。
实操要点:
- 所有节点上用
lsblk或fdisk -l确认共享磁盘可见(如/dev/sdb、/dev/sdc),且权限一致(grid:asmadmin) - 分区类型必须设为
8e(Linux LVM)或fd(Linux RAID autodetect),不能是83(Linux filesystem) - 若使用多路径设备(如
/dev/mapper/mpathb),需先配置multipath.conf并重启multipathd服务 - 不要用
oracleasm(已弃用),Oracle 19c默认推荐AFD或UDEV;但AFD需先运行afda setup并重启GI,否则asmcmd ls看不到磁盘
DATA/RECO/OCR三个磁盘组的冗余模式怎么选
冗余模式不是“越高越好”,它直接影响可用磁盘容量和I/O路径数。选错会导致空间浪费或单点故障。
常见错误现象:CREATE DISKGROUP DATA NORMAL REDUNDANCY执行失败,报错ORA-15018: diskgroup cannot be created,通常是因为物理盘数不足(NORMAL要求至少2块盘,HIGH要求至少3块)。
选择依据:
-
+OCR:必须用NORMAL或HIGH冗余,不能EXTERNAL——OCR/Voting Disk没RAID保护就等于集群没心跳 -
+DATA:若底层已做RAID 10,用EXTERNAL;若裸盘直连,必须NORMAL(2块盘镜像)或HIGH(3块盘镜像+条带) -
+RECO:归档和备份IO压力大,建议与+DATA同等级冗余,避免恢复时因磁盘故障中断 - 注意:
EXTERNAL模式下,ASM不管理镜像,完全依赖硬件RAID;NORMAL模式下,ASM自动跨故障组(failure group)分配镜像,必须显式指定FAILGROUP或让ASM自动分组
AFD启用后磁盘标签失效怎么办
启用AFD后,原来用udevadm或oracleasm打的标签(如ASMDISK1)会失效,asmca里看不到磁盘,asmcmd lsdsk返回空。
这是因为AFD接管了设备访问路径,所有磁盘必须通过/dev/oracleafd/disks/下的AFD标签访问。
解决步骤:
- 确认AFD已启动:
afda status应显示AFD is running - 用
afda register重新注册磁盘:afda register /dev/sdb1(注意是分区,不是整盘) - 检查标签是否生效:
ls -l /dev/oracleafd/disks/应看到类似ASMDISK_DATA1 -> /dev/sdb1的软链 - 如果仍不可见,检查
/etc/udev/rules.d/99-oracle-afd.rules是否存在,缺失则需重装GI安装包中的root.sh脚本生成 - 切记:
asmca图形界面里“Candidate Disks”列表只显示AFD路径下的设备,传统/dev/sdX路径不会出现
静默创建磁盘组的命令容易漏掉的关键参数
用asmcmd或SQL*Plus静默建磁盘组时,CREATE DISKGROUP语句看似简单,但漏掉一个参数就会导致后续数据库无法写入数据文件。
典型错误:CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/sdb1'; —— 这样建出来的磁盘组没有ATTRIBUTE 'au_size'='4M',而19c默认AU大小是4MB,若用默认1MB会导致ASM元数据膨胀、性能下降。
安全写法(以+DATA为例):
CREATE DISKGROUP DATA NORMAL REDUNDANCY FAILGROUP FG1 DISK '/dev/oracleafd/disks/ASMDISK_DATA1' FAILGROUP FG2 DISK '/dev/oracleafd/disks/ASMDISK_DATA2' ATTRIBUTE 'au_size'='4M', 'compatible.asm'='19.0', 'compatible.rdbms'='19.0';
关键点:
-
compatible.asm和compatible.rdbms必须显式设为19.0,否则默认是12.1,后续升级会受限 - 即使单故障组(如测试环境),也建议写
FAILGROUP,避免ASM误判为外部冗余 -
au_size一旦设定不可更改,生产环境务必确认后再执行 - 建完立刻验证:
SELECT name, state, type, total_mb, free_mb FROM v$asm_diskgroup;,state必须为MOUNTED
srvctl start database也会因ASM实例无法发现全部磁盘而失败。每次注册新磁盘,都要在每个节点上单独执行afda register并验证asmcmd lsdsk输出一致。


















