如何修复Oracle 19c RAC中ORA-15063错误_检查ASM磁盘组中的发现路径设置

胖强酱_5759

胖强酱_5759

2026-05-01

468人浏览

原创

ORA-15063错误在Oracle 19c RAC中表明ASM实例未识别目标磁盘,主因是asm_diskstring配置不当、设备权限错误或磁盘头残留;需通过v$asm_disk确认发现状态,显式设置asm_diskstring、统一udev命名、修正grid用户权限,并必要时用dd清理前4MB磁盘头。

ora-15063 错误在 oracle 19c rac 中几乎总是意味着 asm 实例根本没“看见”你认为它该看到的磁盘——不是磁盘坏了,而是发现路径(asm_diskstring)配置不当、权限错位或磁盘头残留导致的“视而不见”。

确认 ASM 是否真能发现目标磁盘

别急着改参数或删磁盘组,先看 ASM 自己“看到”了什么。连上 ASM 实例执行:

SELECT path, header_status, mode_status, state FROM v$asm_disk;

关键看三列:path 是否包含你期望的设备路径(如 /dev/mapper/datap1),header_status 是否为 MEMBER 或 PROVISIONED,state 是否为 NORMAL。如果某块盘完全没出现在结果里,说明它压根没被发现——问题一定出在 asm_diskstring 或底层权限上。

  • 若 v$asm_disk 返回空或只有部分盘,asm_diskstring 极可能为空、错配或通配符失效
  • 若盘出现在列表中但 header_status = PROVISIONED,说明磁盘未被加入任何磁盘组,但可被识别——此时创建磁盘组通常没问题
  • 若 header_status = FORMER 或 CANDIDATE,说明磁盘曾属其他磁盘组或有残留元数据,需清理后重试

检查并修正 asm_diskstring 参数

asm_diskstring 是 ASM 扫盘的“搜索范围”,不是“自动猜路径”。19c 默认值为 NULL,理论上会扫描所有可读写块设备,但实际常因 udev 规则、ASMLIB 或权限问题失效。必须显式指定。

查当前值:

SHOW PARAMETER asm_diskstring;

常见错误配置:

  • ORCL:*:19c 中 ASMLIB 已弃用,此语法在非 ASMLIB 环境下基本无效
  • /dev/oracleasm/disks/*:仅适用于旧版 ASMLIB,19c RAC 多用 udev 或 multipath,路径应指向 /dev/mapper/xxx 或 /dev/dm-*
  • 单节点设置后未同步到集群:RAC 中每个节点的 ASM 实例都需独立配置该参数

安全做法是明确列出所有磁盘路径(逗号分隔,不带空格):

ALTER SYSTEM SET asm_diskstring='/dev/mapper/datap1','/dev/mapper/datap2','/dev/mapper/frap1' SCOPE=BOTH SID='*';

注意 SID='*' 表示对所有 ASM 实例生效(RAC 必须加);SCOPE=BOTH 确保内存和 SPFILE 同时更新。

验证磁盘权限与设备路径一致性

即使 asm_diskstring 写对了,ASM 进程(运行用户通常是 grid)也必须对设备文件有读写权限。19c RAC 默认使用 grid:oinstall 用户启动 ASM。

检查设备权限:

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
ls -l /dev/mapper/datap1

正确输出应类似:

brw-rw---- 1 grid oinstall 253, 3 Apr 28 10:22 /dev/mapper/datap1
  • 若属主不是 grid 或组不是 oinstall,用 chown grid:oinstall /dev/mapper/datap1
  • 若权限不是 brw-rw----,用 chmod 660 /dev/mapper/datap1
  • 若设备路径在各节点不一致(例如 node1 是 /dev/mapper/datap1,node2 是 /dev/dm-3),必须用 udev 规则统一命名,否则 RAC 启动失败

udev 规则示例(/etc/udev/rules.d/99-oracle-asm.rules):

KERNEL=="dm-*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="3600507680282004d0000000000000123", SYMLINK+="mapper/datap1"

清理磁盘头残留再重试

ORA-15063 常在重复建磁盘组后出现,尤其当之前用 dd 写过测试数据、或磁盘曾属其他 ASM 实例。ASM 不会覆盖已有有效头部,哪怕你执行了 DROP DISKGROUP ... FORCE,磁盘头部仍可能残留旧签名。

最稳妥的清理方式(在所有节点上对每块目标磁盘执行):

dd if=/dev/zero of=/dev/mapper/datap1 bs=4096 count=1000 conv=notrunc

这只会擦除前 4MB(足够覆盖 ASM 磁盘头和第一个 AU),不影响后续建组。切勿用 count=0 或全盘清零——既慢又没必要。

执行后重启 ASM 实例(srvctl stop asm -n node1; srvctl start asm -n node1),再查 v$asm_disk,正常应看到 header_status = CANDIDATE,此时即可用 CREATE DISKGROUP 安全重建。

真正卡住的地方往往不在命令本身,而在磁盘路径是否被所有节点以完全一致的方式识别——udev 规则写错一行,asm_diskstring 就永远找不到盘。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3609

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2428

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1380

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1318

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1416

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2338

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3860

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

18215

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程