ITPub博客

首页 > 数据库 > Oracle > 如何真正杀掉killed会话

如何真正杀掉killed会话

原创 Oracle 作者:梦夕林1992 时间:2026-04-15 18:06:52 0 删除 编辑

# 问题描述

会话状态显示为KILLED,但实际上无法真正杀掉,kill操作后会话仍然存在。具体表现为:

- 会话状态为KILLED,但通过PADDR在v$process中找不到对应的进程

- 执行alter system kill session命令后,会话仍然存在

- 会话长时间处于KILLED状态,无法自动清除


# 处理步骤

## 1. 确认问题

**查询KILLED状态的会话:**

select inst_id,to_char(sid) as sid,serial#,program,machine,username,status,event,to_char(seconds_in_wait) as seconds,blocking_instance,blocking_session 

from gv$session 

where status='KILLED' 

order by blocking_instance,blocking_session,seconds_in_wait;

**查询结果示例:**

- INST_ID: 3

- SID: 3402

- SERIAL#: 33861

- PROGRAM: plsqldev.exe

- MACHINE: WORKGROUP\WIN-G0UL56543VT

- USERNAME: SHSICT

- STATUS: KILLED

- EVENT: SQL*Net message from client

- SECONDS: 239679

**尝试通过PADDR查询对应进程:**

SELECT * FROM gv$process WHERE addr = '0000001D81DD1E40';

**查询结果:**

no rows selected

**尝试kill会话:**

alter system kill session '3402,33861,3' immediate;

**执行结果:**

System altered.

**再次查询KILLED状态会话,会话仍然存在:**

select inst_id,to_char(sid) as sid,serial#,program,machine,username,status,event,to_char(seconds_in_wait) as seconds,blocking_instance,blocking_session 

from gv$session 

where status='KILLED' 

order by blocking_instance,blocking_session,seconds_in_wait;


## 2. 查找孤立进程

执行以下SQL查询,找出与会话不关联的孤立进程:

SELECT * FROM V$PROCESS WHERE ADDR NOT IN (select PADDR from v$session );

**查询结果示例:**

- 显示多个孤立进程的详细信息,包括ADDR、PID、SPID、PNAME、USERNAME、SERIAL#、TERMINAL、PROGRAM等

- 例如:

  - ADDR: 0000001D1AFEF10

  - PID: 85

  - SPID: 132034

  - PNAME: grid

  - USERNAME: 128

  - PROGRAM: oracle@dcsddb03

  - ADDR: 0000001DC1B4B620

  - PID: 150

  - SPID: 187763

  - PNAME: PZ96

  - USERNAME: oracle

  - PROGRAM: oracle@dcsddb03 (PZ96)


## 3. 识别目标进程

在查询结果中找出:

- LOCAL=NO的业务进程

- 与KILLED会话相关的进程(通过时间、程序名等信息判断)


## 4. 操作系统层面杀掉进程

在操作系统层面使用kill -9命令杀掉对应的SPID进程:

kill -9 SPID值


## 5. 验证结果

再次查询KILLED状态的会话,确认会话已成功清除:

select inst_id,to_char(sid) as sid,serial#,program,machine,username,status,event,to_char(seconds_in_wait) as seconds,blocking_instance,blocking_session 

from gv$session 

where status='KILLED' 

order by blocking_instance,blocking_session,seconds_in_wait;

**查询结果:**

no rows selected

说明会话已成功清除。


# 注意事项

- **谨慎操作**:确保只杀掉确认的孤立进程,避免影响正常业务

- **操作前备份**:操作前建议备份相关信息,以便出现问题时可以恢复

- **验证结果**:操作后务必验证会话是否已成功清除

- **监控**:定期检查系统中是否存在长时间处于KILLED状态的会话,及时处理

- **权限**:确保具有足够的权限执行操作系统层面的kill命令


# 故障案例

**案例描述:**

- 会话SID=<3402,SERIAL#=33861,状态为KILLED

- 执行alter system kill session '3402,33861,3' immediate;命令后,会话仍然存在

- 通过PADDR查询gv$process,显示"no rows selected"


**解决过程:**

1. 执行SELECT * FROM V$PROCESS WHERE ADDR NOT IN (select PADDR from v$session );查找孤立进程

2. 识别并杀掉对应的SPID进程

3. 再次查询KILLED状态会话,确认会话已清除


**结果:**

- 会话成功清除,查询KILLED状态会话显示"no rows selected"

这个方法可以有效解决会话状态为KILLED但无法杀掉的问题,避免这些会话占用系统资源。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29956245/viewspace-3116137/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-10-13

  • 博文量
    90
  • 访问量
    85388