ORA-27101 表示 Oracle 实例未运行或客户端无法访问其共享内存段,根本原因是 ORACLE_SID 对应的实例未启动、SID 配置错误、用户权限不足、/dev/shm 空间不足、memory_target 超限或内核参数不满足,而非监听器或权限配置问题。
ORA-27101 是 Oracle 实例没起来,不是参数或权限问题
这个错误本质是客户端连不到共享内存段,说明 oracle_sid 对应的实例根本没在运行,或者当前环境变量指向了不存在的实例。别急着改 spfile 或查权限,先确认实例状态。
- 用
ps -ef | grep ora_pmon看有没有ora_pmon_<code>ORACLE_SID进程 —— 没有就说明实例没启 - 检查
ORACLE_SID是否拼错,大小写是否匹配(Linux/Unix 区分大小写) - 确认当前用户是
oracle(或具备dba组权限),非 oracle 用户即使 SID 正确也看不到共享内存段 - 如果刚执行过
shutdown abort,但没等干净退出就重试startup,可能残留信号量没清理,需手动ipcs -m+ipcrm
为什么 sqlplus / as sysdba 也报 ORA-27101
因为 sqlplus / as sysdba 默认走操作系统认证 + 共享内存连接,它不依赖监听器,但强依赖本地实例进程和共享内存段存在。如果实例没起,这条路必失败 —— 这时不能靠重启监听器解决。
- 不要尝试用
lsnrctl start来“修复”这个错误,监听器和 ORA-27101 无关 -
sqlplus /nolog后再connect / as sysdba和直接sqlplus / as sysdba行为一致,本质相同 - 若想绕过共享内存(仅调试用),可用
sqlplus /nolog→connect sys/password@localhost:1521/ORCL as sysdba,但这要求监听器已起且数据库注册成功(即实例得先起来)
startup 报 ORA-27101 的典型卡点
执行 startup 命令时出现 ORA-27101,说明实例启动流程在分配 SGA 阶段失败,常见于配置与系统资源冲突。
-
memory_target或sga_target设得超过物理内存或被memlock限制(ulimit -l输出为 32KB 就铁定崩) -
/dev/shm空间不足(尤其 AMM 开启时),用df -h /dev/shm检查,小于此值会静默失败 - 使用了错误的
spfile路径(比如startup pfile='/tmp/init.ora'写错路径),Oracle 会尝试读取但不报路径错,而是 fallback 到默认行为并最终触发 ORA-27101 - Linux kernel 参数
kernel.shmall/kernel.shmmax过小,sysctl -p后需重启服务器或至少sysctl --system生效
怎么快速验证是不是共享内存真没了
直接看内核共享内存列表最可靠,比查日志更快定位是“没启”还是“启崩了”。
- 运行
ipcs -m | grep $ORACLE_SID—— 完全无输出 = 实例没启或启失败后自动清理了段 - 若有输出但权限列是
--w-------(而非rw-------),说明 oracle 用户没权限访问,通常是 umask 或组权限问题 -
oradism工具可辅助诊断:运行oradism -show,若报 “No shared memory realm found”,结论同上 - 注意:
tail -f $ORACLE_BASE/diag/rdbms/*/trace/alert_*.log里最后几行才是真实启动失败原因,ORA-27101 永远是结果,不是根因
ulimit -l 和 /dev/shm 这两个看不见的硬门槛。它们不出错不提醒,只让 ORA-27101 反复出现。










