Oracle 数据库 SHUTDOWN IMMEDIATE 卡住无法关闭的解决方法

问题描述

在 UAT 环境关闭 Oracle 数据库时,执行 SHUTDOWN IMMEDIATE 后一直无响应,命令卡住不返回。

排查过程

第一步:检查活跃会话

SELECT SID, SERIAL#, STATUS, EVENT, SECONDS_IN_WAIT, BLOCKING_SESSION
FROM V$SESSION
WHERE STATUS='ACTIVE'
AND SID != (SELECT SID FROM V$SESSION WHERE AUDSID=SYS_CONTEXT('USERENV','SESSIONID'));

第二步:分析结果

从查询结果可以看到:

| SID | SERIAL# | EVENT | BLOCKING_SESSION | |-----|---------|-------|------------------| | 3 | 40787 | LGWR worker group idle | 3218 | | 5649 | 38464 | LGWR worker group idle | 3218 |

关键发现:SID 3 和 SID 5649 被 SID 3218 阻塞,导致整个数据库无法完成 checkpoint 和关闭流程。

第三步:强制杀掉阻塞会话

ALTER SYSTEM KILL SESSION '3,40787' IMMEDIATE;
ALTER SYSTEM KILL SESSION '5649,38464' IMMEDIATE;

SHUTDOWN IMMEDIATE;

第四步:如果杀不掉,直接 ABORT

SHUTDOWN ABORT;

⚠️ 注意:SHUTDOWN ABORT 相当于突然断电,未提交的事务会丢失,UAT 环境专用。

正确关闭顺序(推荐)

  1. 先 kill 掉所有 Java 应用进程
  2. 确认无活跃连接后再执行数据库关闭
  3. SHUTDOWN IMMEDIATE

结论

Oracle SHUTDOWN IMMEDIATE 卡住的根本原因是:还有未释放的数据库会话被阻塞,导致 LGWR 无法完成 checkpoint,整个关闭流程卡死。解决思路是查出活跃会话 → 找出 BLOCKING_SESSION → 杀掉阻塞会话 → 重新执行关闭。


0 Comments latest

No comments.