PMON failed to acquire latch 的报错及sqlplus / as sysdba 无法连接

你遇到的情况是:PMON 进程存在(说明实例在运行),但 sqlplus / as sysdbaconnect / as sysdba 无法连接 ,同时你提到有 PMON failed to acquire latch 的报错。这表明数据库实例可能已经挂起(hung)或处于严重异常状态,无法响应新的连接请求。


🔴 当前问题的本质

  • PMON 进程虽然存在,但可能卡死或陷入无限循环(如 latch 争用)。
  • 共享内存(SGA)可能无法访问或损坏。
  • 实例未完全崩溃,但已失去响应能力,无法接受新会话。
  • 此时 sqlplus 连接会 卡住、超时或直接报错 (如 ORA-03113: end-of-file on communication channel)。

✅ 解决方案:强制关闭并重启实例

由于数据库已无响应,必须强制终止当前实例,然后重新启动


🛠️ 步骤 1:尝试用 sqlplus 强制关闭(可能失败)

bash 复制代码
sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown abort;
  • 如果命令卡住或报错(如 ORA-03114: not connected to ORACLE),说明无法通信,直接进入步骤 2

🛠️ 步骤 2:使用 orakill(Windows)或 kill(Linux/Unix)清理进程

✅ Linux/Unix 系统:
bash 复制代码
# 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 失败时使用。

✅ 验证进程是否已清理:
bash 复制代码
ps -ef | grep pmon
# 正常情况下应无输出

🛠️ 步骤 3:清理共享内存和信号量(关键!)

Oracle 使用共享内存(SGA)和信号量(semaphores),如果进程被 kill -9,这些资源可能残留,导致下次启动失败。

bash 复制代码
# 查看共享内存段
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 segmentORA-29770 的常见原因。


🛠️ 步骤 4:重新启动数据库

bash 复制代码
# 设置环境
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)

bash 复制代码
# 启动数据库
srvctl start database -d <DB_NAME>

# 检查状态
srvctl status database -d <DB_NAME>

📋 启动后必须做的事

  1. 检查告警日志

    bash 复制代码
    tail -f $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log

    查看是否有 PMON failed to acquire latch 再次出现。

  2. 确认数据库是否稳定

    sql 复制代码
    select status, instance_name from v$instance;
  3. 排查根本原因

    • 是否有 内存不足free -h
    • 是否有 存储 I/O 问题iostat -x 1
    • 是否是 Oracle Bug ?在 MOS 上搜索 PMON failed to acquire latch + 你的 Oracle 版本。
    • 是否有 高 latch 争用 ?检查 AWRaddmrpt.sql 报告。

🚫 为什么不建议一直 kill -9

  • 可能导致数据文件不一致(虽然 Oracle 有实例恢复机制)。
  • 频繁发生说明有深层问题(Bug、硬件、配置不当)。

✅ 总结:你现在应该怎么做?

步骤 操作
1 `ps -ef
2 尝试 sqlplus / as sysdbashutdown abort;(可能失败)
3 kill -9 所有 Oracle 进程(pmon, smon, lmon 等)
4 ipcs -mipcs -s → 清理残留共享内存和信号量
5 sqlplus / as sysdbastartup 重新启动
6 检查 alert.log,分析 PMON failed to acquire latch 根本原因

📌 强烈建议 :重启后立即收集告警日志和可能的 trace 文件,联系 DBA 或 Oracle 支持,排查是否为已知 Bug(如某些版本的 kgl latch 问题)。

如果你提供 Oracle 版本(如 11.2.0.4, 19c 等)和 alert.log 中的几行错误日志,我可以帮你判断是否是已知问题。

相关推荐
折哥的程序人生 · 物流技术专研34 分钟前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
AOwhisky37 分钟前
Redis 学习笔记(第三期):持久化与主从复制
运维·数据库·redis·笔记·学习·云计算
李白的天不白37 分钟前
数据库连接报错问题
数据库
一条泥憨鱼1 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
c238561 小时前
Linux C++ 进度条进阶美化与工程化封装
linux·运维·服务器
李小白661 小时前
第四天-WEB服务器基本原理,IIS服务
运维·服务器·前端
2401_834636992 小时前
Nginx 从入门到实战:静态 / 动态站点、PHP 部署与反向代理全解析
运维·nginx·php
爱喝水的鱼丶2 小时前
SAP-ABAP:SAP视图开发入门:四类标准视图的适用场景与创建步骤详解
服务器·数据库·性能优化·sap·abap
大白要努力!2 小时前
MySQL 8.0 + Navicat 完整操作指南
数据库·mysql
aosky2 小时前
一台电脑配置多个 SSH Key 对应不同的 GitHub 账号
运维·ssh·github