Oracle数据库启动失败:ORA-29701、ORA-01565、ORA-17503故障处理记录_20260429

数据库服务器重启后,Oracle Grid/HAS 未正常恢复,ASM 磁盘组未挂载,导致数据库未能自动启动。

一、故障背景

Oracle 服务器重启,数据库无法正常启动。登录服务器后,首先检查文件系统空间,发现磁盘空间正常,并没有出现根目录、Oracle 目录或备份目录空间满的情况。

复制代码
df -h

结果显示 /oracle/backup 等目录空间都比较充足,因此基本可以排除磁盘空间不足导致数据库无法启动的问题。

随后切换到 Oracle 用户,检查监听状态:

复制代码
su - oracle
lsnrctl status

返回如下错误:

复制代码
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused

初看像是监听器没有启动,但继续检查数据库实例时,发现问题并不只是监听器。

执行:

复制代码
sqlplus / as sysdba

连接后提示:

复制代码
Connected to an idle instance.

说明数据库实例当前并未启动。

尝试启动数据库:

复制代码
startup

结果报错:

复制代码
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file '+SYSTEM/mesdb/spfilemesdb.ora'
ORA-17503: ksfdopn:2 Failed to open file +SYSTEM/mesdb/spfilemesdb.ora
ORA-29701: unable to connect to Cluster Synchronization Service

二、故障现象分析

这几个错误信息很关键。

1. ORA-01078

复制代码
ORA-01078: failure in processing system parameters

表示数据库在读取启动参数时失败。

2. ORA-01565 和 ORA-17503

复制代码
ORA-01565: error in identifying file '+SYSTEM/mesdb/spfilemesdb.ora'
ORA-17503: ksfdopn:2 Failed to open file +SYSTEM/mesdb/spfilemesdb.ora

说明数据库启动时需要读取 spfile 文件:

复制代码
+SYSTEM/mesdb/spfilemesdb.ora

但是这个文件不是放在普通文件系统中,而是放在 ASM 磁盘组 +SYSTEM 里面。

也就是说,数据库启动前,ASM 必须先正常运行,并且 SYSTEM 磁盘组必须已经挂载。

3. ORA-29701

复制代码
ORA-29701: unable to connect to Cluster Synchronization Service

这个错误才是关键。

它说明数据库无法连接到 CSS,也就是 Cluster Synchronization Service。

在使用 ASM 的环境中,CSS 是基础组件。CSS 没起来,ASM 就无法正常工作;ASM 没起来,磁盘组就无法挂载;磁盘组无法挂载,数据库自然无法读取放在 ASM 中的 spfile。

所以这次问题的真正链路是:

复制代码
HAS / Grid Infrastructure 未正常启动
        ↓
CSSD 未正常运行
        ↓
ASM 未启动
        ↓
+SYSTEM 磁盘组未挂载
        ↓
数据库无法读取 spfile
        ↓
数据库启动失败

因此,最开始的 TNS:no listener 只是表象,不是根因。

真正的问题不是监听,也不是数据库文件损坏,而是 Grid / HAS / ASM 没有正常启动


三、排查过程

首先查看相关进程:

复制代码
ps -ef | egrep "ohasd|ocssd|crsd|evmd|asm_pmon|pmon|tnslsnr" | grep -v grep

最初只看到:

复制代码
/bin/sh /etc/init.d/init.ohasd run

但没有看到以下关键进程:

复制代码
ohasd.bin
ocssd.bin
asm_pmon_+ASM
tnslsnr
ora_pmon_mesdb

这说明 Oracle Restart / Grid 相关组件并没有正常起来。

继续查看 Grid Home:

复制代码
cat /etc/oracle/olr.loc

返回:

复制代码
olrconfig_loc=/oracle/app/11.2.0/grid/cdata/localhost/rezha174.olr
crs_home=/oracle/app/11.2.0/grid

由此确认 Grid Home 为:

复制代码
/oracle/app/11.2.0/grid

检查 HAS 状态:

复制代码
/oracle/app/11.2.0/grid/bin/crsctl check has

返回:

复制代码
CRS-4639: Could not contact Oracle High Availability Services

说明 HAS 没有正常启动。


四、故障处理过程[重点]

使用 root 用户启动 HAS:

复制代码
/oracle/app/11.2.0/grid/bin/crsctl start has

启动后再次检查:

复制代码
/oracle/app/11.2.0/grid/bin/crsctl check has

返回:

复制代码
CRS-4638: Oracle High Availability Services is online

说明 HAS 已经恢复正常。

继续检查资源状态:

复制代码
/oracle/app/11.2.0/grid/bin/crsctl stat res -t

刚开始看到 ASM 还处于启动过程中:

复制代码
ora.asm    ONLINE  OFFLINE  Instance Shutdown, STARTING

此时说明 HAS 和 CSSD 已经起来,但 ASM 还没有完全启动成功,数据库仍然不能启动。

随后继续观察,ASM 进程已经出现:

复制代码
ps -ef | egrep "asm_pmon|asm_smon|asm_lgwr|ohasd|ocssd|evmd|tnslsnr" | grep -v grep

可以看到:

复制代码
asm_pmon_+ASM
asm_lgwr_+ASM
asm_smon_+ASM

说明 ASM 已经正常启动。

最终再次查看资源状态:

复制代码
/oracle/app/11.2.0/grid/bin/crsctl stat res -t

状态恢复正常:

复制代码
ora.DATA.dg       ONLINE  ONLINE
ora.DGGRID01.dg   ONLINE  ONLINE
ora.LISTENER.lsnr ONLINE  ONLINE
ora.RECOVERY.dg   ONLINE  ONLINE
ora.SYSTEM.dg     ONLINE  ONLINE
ora.asm           ONLINE  ONLINE  Started
ora.cssd          ONLINE  ONLINE
ora.evmd          ONLINE  ONLINE
ora.mesdb.db      ONLINE  ONLINE  Open

再使用 grid 用户检查 ASM 磁盘组:

复制代码
su - grid
export ORACLE_HOME=/oracle/app/11.2.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
asmcmd lsdg

结果显示所有磁盘组均已挂载:

复制代码
DATA       MOUNTED
DGGRID01   MOUNTED
RECOVERY   MOUNTED
SYSTEM     MOUNTED

其中 SYSTEM 磁盘组已经挂载,数据库也就可以读取:

复制代码
+SYSTEM/mesdb/spfilemesdb.ora

最终数据库资源显示:

复制代码
ora.mesdb.db ONLINE ONLINE Open

说明数据库已经正常打开。


五、为什么一开始无法启动数据库?

这次数据库一开始启动失败,根本原因是:

Oracle High Availability Services 没有正常启动,导致 CSSD、ASM 和 ASM 磁盘组都没有正常工作。

而数据库的 spfile 文件存放在 ASM 磁盘组中:

复制代码
+SYSTEM/mesdb/spfilemesdb.ora

当 ASM 没起来时,数据库无法读取 spfile,所以执行 startup 就会报:

复制代码
ORA-01078
ORA-01565
ORA-17503
ORA-29701

所以本次故障不是普通的数据库启动问题,也不是简单的监听器问题。

正确理解应该是:

复制代码
监听没起来,是现象;
数据库 idle,是结果;
ASM 没起来,是直接原因;
HAS/CSSD 没起来,是根因。

六、正确恢复顺序

这类使用 ASM 的 Oracle 数据库,推荐按照下面顺序恢复。

1. root 用户启动 HAS

复制代码
/oracle/app/11.2.0/grid/bin/crsctl start has

2. 检查 HAS 状态

复制代码
/oracle/app/11.2.0/grid/bin/crsctl check has

3. 检查资源状态

复制代码
/oracle/app/11.2.0/grid/bin/crsctl stat res -t

重点关注:

复制代码
ora.cssd
ora.asm
ora.SYSTEM.dg
ora.DATA.dg
ora.LISTENER.lsnr
ora.mesdb.db

4. 如果数据库未自动启动,使用 srvctl 启动数据库

复制代码
su - oracle
srvctl status database -d mesdb
srvctl start database -d mesdb
srvctl status database -d mesdb

5. 最后进入数据库验证

复制代码
sqlplus / as sysdba

执行:

复制代码
select instance_name,status from v$instance;
select name,open_mode,database_role from v$database;

七、经验总结

本次故障处理的关键点是:不要被监听器错误误导。

虽然一开始看到的是:

复制代码
TNS-12541: TNS:no listener

但真正导致数据库启动失败的原因,是 Grid / HAS / ASM 没有正常起来。

对于使用 ASM 的 Oracle 数据库,启动顺序应该是:

复制代码
HAS / Grid
    ↓
CSSD
    ↓
ASM
    ↓
ASM 磁盘组
    ↓
Listener
    ↓
Database

如果跳过前面的基础组件,直接进入数据库执行 startup,数据库就无法访问 ASM 里的 spfile、控制文件、数据文件等资源,自然会启动失败。

本次处理完成后,HAS、CSSD、ASM、磁盘组、监听和数据库均恢复正常,数据库状态为 Open


八、最终结论

本次 Oracle 数据库无法启动的根因是:

Oracle High Availability Services 未正常运行,导致 CSSD、ASM 及 ASM 磁盘组未正常启动,数据库无法访问 ASM 中的 spfile 文件,从而启动失败。

处理方式是:

使用 root 用户启动 HAS,使 CSSD、ASM 和磁盘组恢复 online,随后数据库资源自动恢复 open。

核心恢复命令如下:

复制代码
/oracle/app/11.2.0/grid/bin/crsctl start has
/oracle/app/11.2.0/grid/bin/crsctl check has
/oracle/app/11.2.0/grid/bin/crsctl stat res -t

如果数据库未自动启动,再执行:

复制代码
su - oracle
srvctl start database -d mesdb

一句话总结:

这不是监听器单点故障,也不是数据库文件损坏,而是 Grid/ASM 基础组件没起来。先救 Grid,再救 ASM,最后数据库自然就能打开。

相关推荐
qq_414256571 小时前
生产库如何利用Navicat实现配置特定触发器事件调度_提高管理效率
jvm·数据库·python
2301_808414381 小时前
MySQL表的约束
数据库·mysql
Agent产品评测局1 小时前
离散制造业生产流程优化,AI落地实操步骤详解:从传统自动化到企业级智能体的技术范式跃迁
运维·人工智能·ai·自动化
2301_775639891 小时前
mysql如何查看服务器支持的存储引擎_使用SHOW ENGINES命令
jvm·数据库·python
a7963lin1 小时前
html标签怎样表示搜索框_input type=search语义优化【操作】
jvm·数据库·python
a7963lin1 小时前
Python数据分析如何识别异常值_IQR四分位距检测法实战
jvm·数据库·python
m0_613856291 小时前
如何解决宝塔面板Web端文件管理器打开目录时反应极其缓慢
jvm·数据库·python
阿丰资源1 小时前
基于Spring Boot的新闻推荐系统(源码+数据库+文档)
数据库·spring boot·后端
handler012 小时前
Git 核心指令速查
linux·c语言·c++·笔记·git·学习