oracle 19c rac 中 oracleasm 已彻底弃用,强行使用会破坏磁盘头、导致 asmfd 初始化失败或磁盘组无法挂载;必须改用 asmfd 或纯 udev 规则 + asmtool。
oracle 19c rac 中 oracleasm 已彻底弃用,强行使用会破坏磁盘头、导致 asmfd 初始化失败或磁盘组无法挂载;必须改用 asmfd(asm filter driver)或纯 udev 规则 + asmtool。
为什么 oracleasm 在 19c RAC 上根本不能用
Oracle 官方从 12.1 起标记 oracleasm 为 deprecated,19c 中已完全移除支持。RAC 环境下混用会导致:
-
oracleasm initialize写入的磁盘头与 ASMFD 的过滤逻辑冲突,kfed read可能报KFED-00322: Invalid OSM block type - 执行
oracleasm scandisks后,asmcmd lsdsk仍为空,且asmalert.log出现ORA-15077: could not locate ASM instance - CRS 资源状态显示 online,但本地
ps -ef | grep asm_pmon找不到进程,实际 ASM 实例未启动 - 在 OEL8+/UEK6+ 或 RHEL8+ 上,
oracleasm内核模块默认不编译,modprobe oracleasm直接报Module oracleasm not found in directory /lib/modules/...
正确初始化 ASM 磁盘:优先用 asmfd,次选用 udev + asmtool
asmfd 是 Oracle 19c RAC 的官方强制推荐方案,它在内核层拦截 I/O 并过滤非法写入,比 oracleasm 更安全、更轻量。启用前必须满足:
- 所有节点已安装并运行
grid用户下的 19c Grid Infrastructure(含crsctl和asmcmd) - 共享磁盘(如
/dev/mapper/mpatha)在所有节点上路径一致、权限为0660、属主为grid:asmadmin - 确认
asmfd服务未被禁用:crsctl stat res ora.asmfd -p | grep ENABLED应返回ENABLED=1
启用步骤(root 用户执行):
asmfd -i crsctl start resource ora.asmfd asmcmd afd_lsdsk # 应列出所有已识别磁盘,状态为 'a'
若输出为空或报错 ORA-15242: could not set AFD diskstring,说明磁盘未被 AFD 接管 —— 此时不要回退到 oracleasm,而是检查:
-
ls -l /dev/mapper/mpatha权限是否被 udev 规则覆盖(例如MODE="0600"错写成"0600") -
scsi_id -g -u -d /dev/sda输出的 WWID 是否与/etc/multipath.conf中wwid字段完全一致(含大小写、空格) - 是否遗漏
asmfd依赖包:rpm -q oracleasmlib oracleasm-support在 19c 中无需安装,装了反而冲突
asmtool 标记磁盘:当 asmfd 不可用或需快速验证时的替代方案
asmtool 是纯用户态工具,位于 $ORACLE_HOME/bin/asmtool,不依赖内核模块,适合调试或临时补救。但它**不替代 asmfd**,仅用于打标签供 ASM 实例扫描识别:
- 必须确保磁盘是主分区(
fdisk -l中Id列为83),扩展分区(Id=5)或逻辑分区(Id=8e)会被拒绝 - 命令格式:
asmtool -c -l DATA01 /dev/mapper/mpatha;成功后asmtool -l应返回DATA01 /dev/mapper/mpatha -
asm_diskstring必须包含该路径,例如:ALTER SYSTEM SET asm_diskstring='/dev/mapper/mpath*', '/dev/oracleasm/disks/*' SCOPE=BOTH; - 常见失败原因:
Permission denied(grid用户无设备读写权)、No such file or directory(路径在节点间不一致)、Device is busy(被mdadm或残留dd占用)
最容易被忽略的三个一致性检查点
RAC 下 ASM 磁盘识别失败,80% 源于节点间不一致,而非单点配置错误:
- 所有节点执行
blkid | grep mpath,输出的 UUID、TYPE、PARTUUID 必须逐字符相同;任一节点多出一个mpathe1就会导致 CRS 认为磁盘“不可用” - 所有节点执行
ls -l /dev/mapper/ | grep mpath,设备号(如253,1)必须一致;热插拔后设备号重排是常见隐形故障源 - 所有节点检查
cat /proc/diskstats | grep mpath,I/O 统计值应非零;若全为 0,说明 multipathd 未真正激活该路径,asmfd无法接管
修复完任一节点后,必须在所有节点同步执行 crsctl stop crs -f && crsctl start crs,不能只重启 ASM 实例 —— CRS 元数据缓存不刷新,crsctl stat res -t 显示的状态仍是旧的。











