PMON failed to acquire latch 的报错及sqlplus / as sysdba 无法连接
你遇到的情况是:PMON 进程存在(说明实例在运行),但 sqlplus / as sysdba
或 connect / as sysdba
无法连接,同时你提到有 PMON failed to acquire latch
的报错。这表明数据库实例可能已经挂起(hung)或处于严重异常状态,无法响应新的连接请求。
🔴 当前问题的本质
- PMON 进程虽然存在,但可能卡死或陷入无限循环(如 latch 争用)。
- 共享内存(SGA)可能无法访问或损坏。
- 实例未完全崩溃,但已失去响应能力,无法接受新会话。
- 此时
sqlplus
连接会 卡住、超时或直接报错(如ORA-03113: end-of-file on communication channel
)。
✅ 解决方案:强制关闭并重启实例
由于数据库已无响应,必须强制终止当前实例,然后重新启动。
🛠️ 步骤 1:尝试用 sqlplus
强制关闭(可能失败)
sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown abort;
- 如果命令卡住或报错(如
ORA-03114: not connected to ORACLE
),说明无法通信,直接进入步骤 2。
🛠️ 步骤 2:使用 orakill
(Windows)或 kill
(Linux/Unix)清理进程
✅ Linux/Unix 系统:
# 1. 查看所有 Oracle 进程
ps -ef | grep oracle | grep $ORACLE_SID# 2. 杀掉所有与 Oracle 实例相关的进程(除你自己 shell 外)
# 注意:不要 kill 掉自己的终端进程
ps -ef | grep oracle | grep $ORACLE_SID | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null || true# 或逐个 kill,更安全:
ps -ef | grep pmon
ps -ef | grep smon
ps -ef | grep lmon
# 找到对应 PID,执行 kill -9 <PID>
⚠️
kill -9
是最后手段,仅在shutdown abort
失败时使用。
✅ 验证进程是否已清理:
ps -ef | grep pmon
# 正常情况下应无输出
🛠️ 步骤 3:清理共享内存和信号量(关键!)
Oracle 使用共享内存(SGA)和信号量(semaphores),如果进程被 kill -9
,这些资源可能残留,导致下次启动失败。
# 查看共享内存段
ipcs -m# 查看信号量
ipcs -s# 删除与当前 Oracle 用户相关的共享内存和信号量
ipcs -m | grep oracle | awk '{print $2}' | xargs -I {} ipcrm -m {}
ipcs -s | grep oracle | awk '{print $2}' | xargs -I {} ipcrm -s {}
💡 这些残留资源是
ORA-27121: unable to determine size of shared memory segment
或ORA-29770
的常见原因。
🛠️ 步骤 4:重新启动数据库
# 设置环境
export ORACLE_SID=你的SID
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 # 根据实际路径修改
export PATH=$ORACLE_HOME/bin:$PATH# 启动 sqlplus
sqlplus /nolog
SQL> connect / as sysdba
SQL> startup mount;
SQL> alter database open;
🛠️ 步骤 5:使用 srvctl
(如果使用 ASM 或 Oracle Restart)
# 启动数据库
srvctl start database -d <DB_NAME># 检查状态
srvctl status database -d <DB_NAME>
📋 启动后必须做的事
-
检查告警日志:
tail -f $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log
查看是否有
PMON failed to acquire latch
再次出现。 -
确认数据库是否稳定:
select status, instance_name from v$instance;
-
排查根本原因:
- 是否有 内存不足?
free -h
- 是否有 存储 I/O 问题?
iostat -x 1
- 是否是 Oracle Bug?在 MOS 上搜索
PMON failed to acquire latch
+ 你的 Oracle 版本。 - 是否有 高 latch 争用?检查
AWR
或addmrpt.sql
报告。
- 是否有 内存不足?
🚫 为什么不建议一直 kill -9
?
- 可能导致数据文件不一致(虽然 Oracle 有实例恢复机制)。
- 频繁发生说明有深层问题(Bug、硬件、配置不当)。
✅ 总结:你现在应该怎么做?
步骤 | 操作 |
---|---|
1 | ps -ef | grep pmon 确认进程存在 |
2 | 尝试 sqlplus / as sysdba → shutdown abort; (可能失败) |
3 | kill -9 所有 Oracle 进程(pmon, smon, lmon 等) |
4 | ipcs -m 和 ipcs -s → 清理残留共享内存和信号量 |
5 | sqlplus / as sysdba → startup 重新启动 |
6 | 检查 alert.log ,分析 PMON failed to acquire latch 根本原因 |
📌 强烈建议:重启后立即收集告警日志和可能的 trace
文件,联系 DBA 或 Oracle 支持,排查是否为已知 Bug(如某些版本的 kgl
latch 问题)。
如果你提供 Oracle 版本(如 11.2.0.4, 19c 等)和 alert.log
中的几行错误日志,我可以帮你判断是否是已知问题。