首页 > 数据库 > Oracle > 如何真正杀掉killed会话
# 问题描述
会话状态显示为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/ ,如需转载,请注明出处,否则将追究法律责任。