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 中的几行错误日志,我可以帮你判断是否是已知问题。

相关推荐
珠海西格电力20 小时前
零碳园区工业厂房光伏一体化(BIPV)基础规划
大数据·运维·人工智能·智慧城市·能源
HerayChen20 小时前
HbuilderX 内存溢出报错
java·大数据·linux
程序员小白条20 小时前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
呱呱巨基20 小时前
Linux 进程概念
linux·c++·笔记·学习
liulilittle20 小时前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
Xの哲學20 小时前
Linux Miscdevice深度剖析:从原理到实战的完整指南
linux·服务器·算法·架构·边缘计算
郭涤生20 小时前
QT 架构笔记
java·数据库·系统架构
韩立学长20 小时前
基于Springboot流浪动物领养网站0kh2iyb4(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
DBA小马哥20 小时前
Oracle迁移到金仓数据库:完整迁移步骤与兼容性优化实战
数据库·oracle·国产化平替
你们补药再卷啦20 小时前
ai(二)ubuntu22.04配置环境
linux·ubuntu