ORA-29786: SIHA attribute GET failed with Error If 11gR2 ASM instance is created manually

本文解决在手动创建ASM实例时遇到的ORA-29786错误,介绍如何通过srvctl命令将ASM实例注册到CRS仓库来避免创建或删除磁盘组时出现的问题。

Symptoms

After creating an initial parameter file init+ASM.ora manually and starting an ASM instance, certain ASM commands fails with ORA-29786 in sqlplus:

sqlplus / as sysasm
SQL> create spfile='$ORACLE_HOME/spfile+ASM.ora' from pfile='$ORACLE_HOME/dbs/init+ASM.ora';
create spfile='$ORACLE_HOME/spfile+ASM.ora' from pfile='$ORACLE_HOME/dbs/init+ASM.ora'
*
ERROR at line 1:
ORA-29786: SIHA attribute GET failed with error [Attribute 'SPFILE' sts[200]
lsts[0]]


SQL> create diskgroup dg1 normal redundancy disk'/opt/oracle/oradata/nobilldb/DG1_dev0' disk'/opt/oracle/oradata/nobilldb/DG1_dev1';

Diskgroup created.

SQL> drop diskgroup dg1;
drop diskgroup dg1
*
ERROR at line 1:
ORA-15039: diskgroup not dropped
ORA-29786: SIHA attribute GET failed with error [Attribute 'SPFILE' sts[200]
lsts[0]]

Better option to create ASM instance is to run asmca in GUI/Silent mode.

Changes

Starting with 11gR2, ASM instance is a resoure in CRS repository also in single instance installations. Hence, it must be registered to OCR before doing certain operations like create/drop diskgroup, create pfile/spfile, etc.

Cause

ASM instance is created and started manually but it is not registered to cluster repository.

Solution

If ASM instance is created manually, add ASM instance to CRS repository with srvctl add asm:

srvctl add asm  -p $ORACLE_HOME/dbs/init+ASM.ora

srvctl add asm -h -- will give the options
 
 
小白注: 在grid用户下,出错时执行命令:crs_stat -t 显示如下:
grid@linux177:/opt/oracrs/product/11gR2/grid/bin> crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora.cssd       ora.cssd.type  ONLINE    ONLINE    linux177
ora.diskmon    ora....on.type OFFLINE   OFFLINE
ora.evmd       ora.evm.type   ONLINE    ONLINE    linux177
ora.ons        ora.ons.type   OFFLINE   OFFLINE

少一条:
ora.asm        ora.asm.type   ONLINE    ONLINE    linux177
 
执行命令报错:
grid@linux177:/opt/oracrs/product/11gR2/grid/bin> crsctl start res ora.asm
CRS-2613: Could not find resource 'ora.asm'.
CRS-4000: Command Start failed, or completed with errors.
 
但在目录$ORACLE_HOME/dbs/下,有spfile+ASM.ora
grid@linux177:/opt/oracrs/product/11gR2/grid/dbs> ll
total 20
-rw-rw---- 1 grid oinstall 1334 2013-10-25 11:30 ab_+ASM.dat
-rw-rw---- 1 grid oinstall 1544 2013-10-25 11:30 hc_+ASM.dat
-rw-r--r-- 1 grid oinstall 2851 2009-05-15 13:35 init.ora
-rw-r----- 1 grid oinstall 1536 2013-07-10 00:25 orapw+ASM
-rw-r----- 1 grid oinstall 1536 2013-10-25 11:30 spfile+ASM.ora
 
执行命令:
grid@linux177:/opt/oracrs/product/11gR2/grid/dbs> srvctl add asm  -p $ORACLE_HOME/dbs/init+ASM.ora  
grid@linux140:/opt/oracrs/product/11gR2/grid/dbs> ll
total 20
-rw-rw---- 1 grid oinstall 3291 2013-11-12 17:10 ab_+ASM.dat
-rw-rw---- 1 grid oinstall 1544 2013-11-12 17:10 hc_+ASM.dat
-rw-r--r-- 1 grid oinstall 2851 2009-05-15 13:35 init.ora
-rw-r----- 1 grid oinstall 1536 2013-07-10 00:25 orapw+ASM
-rw-r----- 1 grid oinstall 1536 2013-11-12 17:10 spfile+ASM.ora

这个错误信息是 Oracle 数据库在启动(`startup`)时出现的典型问题,主要涉及 **初始化参数文件(spfile)无法找到或访问**,尤其是当数据库使用的是 **ASM(Automatic Storage Management)磁盘组** 存储时。 --- ### ❌ 错误分析 ```bash ORA-01078: failure in processing system parameters ORA-01565: error in identifying file '+DATA/orcl/spfileorcl.ora' ORA-17503: ksfdopn:2 Failed to open file +DATA/orcl/spfileorcl.ora ORA-15056: additional error message ORA-17503: ksfdopn:2 Failed to open file +DATA/orcl/spfileorcl.ora ORA-15001: diskgroup "DATA" does not exist or is not mounted ``` #### 逐条解释: - `ORA-01078`: 启动数据库时无法处理系统参数 —— 通常是找不到或读取不了 spfile/pfile。 - `ORA-01565`: 识别指定的参数文件失败。 - `ORA-17503`: 低层 I/O 操作失败,无法打开文件。 - `ORA-15001`: 表示 ASM 磁盘组 `"DATA"` 不存在或者没有被挂载。 👉 核心问题是:**ASM 实例未运行,或者磁盘组 `DATA` 没有被挂载,导致 Oracle 实例无法读取存放在 `+DATA` 中的 spfile。** --- ## ✅ 解决方案 ### 步骤 1:确认当前环境变量和实例状态 确保你连接到了正确的 Oracle 环境。 ```bash export ORACLE_SID=+ASM # 如果使用 ASM,默认 SID 是 +ASM 或 +ASM1(RAC) sqlplus / as sysdba ``` ### 步骤 2:检查 ASM 实例是否启动 ```sql SQL> SELECT instance_name, status FROM v$instance; -- 应该输出类似: -- INSTANCE_NAME STATUS -- ---------------- ------------ -- +ASM STARTED ``` 如果没有启动,请先启动 ASM 实例: ```sql SQL> startup; ``` > ⚠️ 注意:如果 ASM 也无法启动,可能是磁盘权限、udev 规则、asmlib 配置或磁盘路径问题。 --- ### 步骤 3:查看磁盘组状态 ```sql SQL> SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup; -- 输出示例: -- NAME STATE TOTAL_MB FREE_MB -- ------ --------- -------- ------- -- DATA MOUNTED 10240 3000 ``` 如果你看到 `DATA` 的状态不是 `MOUNTED`,说明它没挂载。 --- ### 步骤 4:尝试手动挂载磁盘组 ```sql ALTER DISKGROUP DATA MOUNT; ``` 如果报错,比如: - `ORA-15032: not all alterations performed` - `ORA-15063: ASM discovered an insufficient number of disks` → 表明 ASM 无法识别构成 `DATA` 磁盘组的物理磁盘。 --- ### 🔍 排查磁盘问题 #### 查看 ASM 发现的磁盘: ```sql SELECT path, header_status, mode_status FROM v$asm_disk; ``` 期望结果:`DATA` 对应的磁盘 `HEADER_STATUS = MEMBER`, `MODE_STATUS = ONLINE` 如果 `header_status` 是 `CANDIDATE` 或 `UNKNOWN`,说明这些磁盘未被正确识别。 --- ### 可能原因及修复方法 | 原因 | 解决方式 | |------|---------| | ASM 实例未启动 | 执行 `sqlplus / as sysdba` → `startup` | | 磁盘权限问题(Linux) | 检查 `/dev/sdX` 权限是否属于 `grid:asmadmin` | | udev 规则未设置 | 配置持久化设备名规则(如 `/etc/udev/rules.d/99-oracle-asmdevices.rules`) | | ASMLib 配置丢失(若使用) | 使用 `oracleasm scandisks` 和 `oracleasm listdisks` | | 磁盘路径变更(如 VM 迁移后) | 重新绑定设备或修改 udev 规则 | --- ### ✅ 成功挂载后启动数据库实例 一旦 `DATA` 磁盘组成功挂载,切换回数据库实例: ```bash export ORACLE_SID=orcl sqlplus / as sysdba ``` 然后启动数据库: ```sql SQL> startup; ``` 此时应该可以正常读取 `+DATA/orcl/spfileorcl.ora` 并启动。 --- ### 💡 替代方案:使用 PFILE 启动(临时) 如果暂时无法恢复 SPFILE,可以从 ASM 中创建一个文本型 PFILE: ```sql --ASM 实例中导出参数 CREATE PFILE='/tmp/initorcl.ora' FROM SPFILE='+DATA/orcl/spfileorcl.ora'; ``` 然后用该 PFILE 启动数据库: ```sql SQL> CREATE SPFILE FROM PFILE='/tmp/initorcl.ora'; SQL> startup; -- 自动使用 SPFILE ``` > 注意:前提是 ASM 能读到原始 spfile。否则只能手动写一个最小 pfile。 --- ### 🛠 示例:最小 PFILE 启动(应急) ```text # /tmp/initorcl.ora orcl.__db_cache_size=100M orcl.__shared_pool_size=80M *.db_name='orcl' *.control_files='+DATA/orcl/controlfile/current.256.123456789' *.instance_type='RDBMS' *.job_queue_processes=10 *.open_cursors=300 *.pga_aggregate_target=100M *.sga_target=300M *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' ``` 然后: ```sql SQL> create spfile from pfile='/tmp/initorcl.ora'; SQL> startup; ``` --- ## ✅ 总结流程图 ```text 启动数据库失败 ↓ 检查是否能访问 +DATA/orcl/spfileorcl.ora ↓ 否 → 检查 ASM 实例是否运行? ↓ 否 → 启动 ASM 实例 ↓ 是 → 检查磁盘组 DATA 是否存在并已挂载? ↓ 否 → 挂载磁盘组(需解决磁盘识别问题) ↓ 是 → 尝试重新启动 DB 实例 ↓ 成功 or 失败 → 查看 alert.log 进一步诊断 ``` --- ### ✅ 关键命令汇总 ```bash # 设置环境 export ORACLE_SID=+ASM sqlplus / as sysdba # 检查 ASM 实例 SELECT instance_name, status FROM v$instance; # 启动 ASM startup; # 查看磁盘组 SELECT name, state FROM v$asm_diskgroup; # 挂载磁盘组 ALTER DISKGROUP DATA MOUNT; # 查看磁盘状态 SELECT path, header_status, mode_status FROM v$asm_disk; # 切换到数据库实例 export ORACLE_SID=orcl sqlplus / as sysdba startup; ``` --- ### ✅ 查看告警日志定位细节 ```bash cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/ tail -f alert_orcl.log ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值