ORA-01034 表示 Oracle 实例不可用,需先确认实例是否真正未启动:检查 ora_pmon_<SID> 进程是否存在;若存在,则多为连接配置或权限问题;本地连接失败优先核对 ORACLE_SID 和 ORACLE_HOME;远程失败先 tnsping 测试监听;RAC 环境需检查 CRS 资源状态。
ORA-01034 出现时,先确认 Oracle 实例是否真没起来
这个错误表面是“实例不可用”,但背后可能是进程挂了、监听没配对、或者只是当前用户没权限连上。别急着重启服务,先看 ps -ef | grep ora_ —— 如果 ora_pmon_<sid> 进程不存在,才是真没启动;如果存在,大概率是连接路由问题(比如用了错的 tnsnames.ora 条目或指定了不存在的 sid)。
常见错误现象:sqlplus / as sysdba 能连但报 ORA-01034,说明数据库没 open;而 sqlplus username/password@tns_alias 报这个错,更可能是 tns 解析失败或远程监听压根没响应。
- 本地直连(
/ as sysdba)报错 → 优先查ORACLE_SID是否设对、ORACLE_HOME是否指向正确路径 - 远程连接报错 → 先用
tnsping <alias>看是否能通到监听器,再查监听日志$ORACLE_HOME/network/log/listener.log - Linux 下注意:Oracle 启动依赖共享内存段,
ipcs -m若残留旧段且权限不对,也会导致 pmon 启不起来
检查 init.ora 或 spfile 是否加载成功
实例启动失败常卡在参数文件读取阶段。即使你执行了 startup,也可能因参数语法错误、路径不存在或权限不足而静默失败(只报 ORA-01034,不提示具体原因)。
使用场景:刚改过 spfile,或从备份恢复后首次启动。
- 启动时加
nomount模式:运行startup nomount,若仍报 ORA-01034,基本可断定是参数文件问题 - 临时用 pfile 启动验证:执行
startup nomount pfile='/path/to/init.ora',绕过 spfile 加载逻辑 - 关键参数检查:
db_name必须和实际数据库名一致;control_files路径必须真实存在且 Oracle 用户有读写权;memory_target值不能超过系统可用内存
监听器(listener)正常 ≠ 数据库实例可用
很多人看到 lsnrctl status 显示监听器运行中,就以为数据库肯定 OK —— 这是典型误区。监听器只负责转发连接请求,它完全不知道后端实例有没有 open,甚至能不能 mount。
性能 / 兼容性影响:Oracle 12c+ 默认启用动态注册(PMON 向监听器上报状态),但如果 local_listener 参数没设对,或监听器配置了 STATIC_HANDLERS 但没配 GLOBAL_DBNAME,就会出现“监听器在线、但拒绝连接”的假象。
- 运行
lsnrctl services,看输出里有没有你 SID 对应的服务条目,且状态为READY(不是UNKNOWN) - 如果只有
UNKNOWN,说明 PMON 没注册成功,检查local_listener和remote_listener参数,或临时加静态注册 - Windows 下注意:OracleService<SID> 服务可能显示“已启动”,但实例实际未 open —— 服务启动只拉起后台进程,不等于数据库就绪
ORA-01034 在 RAC 环境下要多看 CRS 和实例状态
RAC 下这个错往往不是单点故障,而是集群资源没上线。比如 crsctl check crs 显示 CRS 不健康,或 crsctl stat res -t 里 ora.<db>.db 资源状态不是 ONLINE,都会导致客户端连任何节点都报 ORA-01034。
容易踩的坑:误以为某个节点实例挂了,其实是 VIP 漂移失败或 SCAN 监听器没起来,导致所有连接都被打到一个坏节点上。
- 先跑
crsctl stat res -t | grep -E "(db|asm|listener)",确认数据库资源、ASM 实例、SCAN listener 全部 online - 查 OCR 状态:
ocrcheck输出必须是Status of OCR is good,否则集群注册信息损坏,实例无法加入 - 不要只看单节点的
ps -ef | grep pmon,RAC 中某节点实例 down 了,其他节点照样能提供服务 —— 除非你硬编码连了那个坏节点的 VIP
最麻烦的情况是数据库处于 MOUNT 状态但没 OPEN,这时候所有非 SYSDBA 用户连接都会触发 ORA-01034,而 DBA 很容易忽略这个细节,因为 select status from v$instance 返回的是 MOUNTED 而不是 OPEN。

















