Oracle 11gR2 后应使用 asmtool(或 udev+asmcmd)替代已弃用的 oracleasm;前者为用户态工具、兼容性好,后者依赖易出错的内核模块,混用会导致磁盘状态不一致。
asmtool 和 oracleasm 命令到底该用哪个
oracle 11gr2 之后,oracleasm 工具已被弃用,官方推荐用 asmtool(或更现代的 udev 规则 + asmcmd)管理 asm 磁盘。但很多老环境还在用 oracleasm,混用会导致磁盘状态不一致、asm 实例无法识别磁盘。
-
oracleasm是 Oracle 提供的内核模块级工具,依赖oracleasm内核模块,只适用于 RHEL/CentOS/OEL 6/7;在 OEL8+ 或 UEK6+ 上默认不加载,强行启用易出错 -
asmtool是纯用户态工具(位于$ORACLE_HOME/bin/asmtool),不依赖内核模块,直接扫描裸设备或分区,兼容性更好 - 若系统已启用了
udev规则绑定磁盘(比如用scsi_id+/etc/udev/rules.d/99-oracle-asm.rules),就完全不需要oracleasm
挂载 ASM 磁盘组前必须确认的三件事
不是执行了 asmca 或 CREATE DISKGROUP 就能成功挂载——漏掉任一环节都会卡在 ERROR: diskgroup not mounted 或 no disks discovered。
- 磁盘必须有可读权限:Oracle 用户(通常是
grid)对磁盘路径(如/dev/sdb1)要有read+write权限,检查用ls -l /dev/sdb1;权限不对时,asmtool -l能看到设备但asmcmd lsdg显示为空 - 磁盘不能被其他进程占用:运行
fuser -v /dev/sdb1,若有输出(比如mdadm、lvm或残留的dd进程),必须先清理,否则CREATE DISKGROUP报ORA-15018: diskgroup cannot be created - ASM 实例必须处于
MOUNTED状态,且asm_diskstring参数已正确设置(例如ALTER SYSTEM SET asm_diskstring='/dev/sd*','/dev/oracleasm/disks/*' SCOPE=BOTH;),否则连磁盘都扫不出来
用 asmtool 标记磁盘的实际步骤(替代 oracleasm initialize)
oracleasm initialize 的作用本质是写入 ASM 头信息并注册设备名,asmtool 可以直接完成等效操作,且不依赖内核模块。
- 先确认磁盘干净:
dd if=/dev/zero of=/dev/sdb1 bs=1024 count=100(清前 100KB,避免残留 LVM/MD 签名) - 打标签:
asmtool -c /dev/sdb1 -l DATA01(-c表示 create label,-l指定磁盘别名) - 验证是否生效:
asmtool -l应显示DATA01 /dev/sdb1;若无输出,说明没写成功,常见原因是磁盘被udev规则重命名或权限不足 - 注意:
asmtool不会自动创建设备映射路径,别名仅用于 ASM 内部识别,diskstring仍需包含原始路径
为什么 asmcmd lsdg 显示磁盘组但状态是 DISMOUNTED
挂载失败往往不是语法问题,而是底层磁盘元数据或权限链断裂。最常被忽略的是磁盘头校验和失效或时间戳异常。
- 执行
amdu -dump DATA01(需安装amdu工具),查看输出中disk header status是否为VALID;若为CORRUPT或UNKNOWN,说明磁盘头损坏,需用dd重写或换盘 - 检查磁盘时间戳:
stat /dev/sdb1中的Modify时间如果比Change时间还新,可能是文件系统误写入,ASM 拒绝挂载 - 在 RAC 环境下,所有节点必须对同一磁盘看到完全相同的路径和权限,
udev规则未同步或asmlib未统一禁用,会导致部分节点识别不到磁盘
真正麻烦的从来不是命令敲不对,而是磁盘状态在不同层级(内核、udev、ASM 实例、RAC 共享层)之间不一致——查的时候得一层层剥,别只盯着 sqlplus / as sysasm 里那几条语句。










