ALTER SYSTEM KILL Session Marked for Killed Forever [ID 1020720.102]

本文档介绍如何在Oracle数据库中永久清除被标记为已杀死的会话。通过查询进程标识符并使用特定命令来终止这些会话,帮助数据库管理员解决顽固的会话问题。
PURPOSE

This document briefly describes how to suppress sessions marked killed in v$session.



SCOPE & APPLICATION

Useful for DBAs.





ALTER SYSTEM KILL Session Marked for Killed Forever:

====================================================



You have a session that you have killed, but it seems as though it will not go away:



SQL> alter system kill session 'sid, serial#';



SQL> select status, username from v$session;



status killed

username username



You have issued this several times and it seems it still is marked as killed.



In order to determine which process to kill:



a) On a Unix platform:



SQL> SELECT spid

FROM v$process

WHERE NOT EXISTS ( SELECT 1

FROM v$session

WHERE paddr = addr);



or



SQL> SELECT inst_id, status, event, state, blocking_session, sid, serial#, program

FROM gv$session

WHERE status = 'KILLED';



% kill <spid>







b) On a Windows platform:



SQL> SELECT spid, osuser, s.program

FROM v$process p, v$session s

WHERE p.addr=s.paddr;



Then use the orakill utility at the DOS prompt:



c:/> orakill <SID> <spid>



where <SID> = the Oracle instance name (ORACLE_SID)

<spid> = the thread id of the thread to kill







Explanation:

============



The simplest (and probably most common) reason the session stays

around is because the process is still around. The reason the

process is still around is because it is waiting on "SQLNet

message from client". If it does ever get a message, it will

then respond with an ORA-28 "Your session has been killed"

error number. At that point the session should go away. The

dedicated server process may remain alive until the client

disconnects or exits.



PMON may take ownership of the session while it is cleaning

up any resources held by the session at the time it was killed.

If it cannot clean everything up immediately it will leave the

session under the PSEUDO process while performing other tasks.





By finding the spid you can then force the process to be killed.



When issuing the 'kill' command be sure that you kill "DEDICATED SERVER PROCESSES", those called:



oracle<SID> (local=NO)



where <SID> is the ORACLE_SID.



Be sure you do not kill processes such as:



ora_d000_<SID>

ora_s000_<SID>

ora_pmon_<SID>






Related Documents:

=================



Note:100859.1
ALTER SYSTEM KILL SESSION does not Release Locks Killing a

Thread on Windows NT

Note:1041427.6
KILLING INACTIVE SESSIONS DOES NOT REMOVE SESSION ROW FROM

V$SESSION

Note:1023442.6
HOW TO HAVE ORACLE CLEAN-UP OLD USER INFO AFTER KILLING

SESSION UNDER MTS

Note:387077.1
How to find the process identifier (pid, spid) after the

corresponding session is killed?







<think>好的,我现在需要解释Oracle数据库中ALTER SYSTEM DISCONNECT SESSIONALTER SYSTEM KILL SESSION的区别。首先,我得回忆一下这两个命令的基本用法和它们的作用机制。 用户之前问过关于从操作系统层面kill会话的问题,现在他们想了解这两个命令的区别。我需要确保回答准确,同时结构清晰,符合用户的要求。首先,我需要确定这两个命令在Oracle中的具体行为,包括它们如何终止会话,对事务的影响,以及使用场景的不同。 可能ALTER SYSTEM KILL SESSION是更常见的命令,它会标记会话为killed,然后由PMON进程处理回滚和资源释放。而ALTER SYSTEM DISCONNECT SESSION可能更直接终止会话,比如断开连接,但不确定具体细节。需要查阅资料确认两者的区别,比如是否立即终止进程,是否允许事务回滚,以及资源释放的方式。 另外,用户提到需要中文回答,结构清晰,所以需要分点说明,可能用表格对比,注意事项,以及使用建议。还要注意之前的回答中提到了PMON的作用,事务回滚机制,这些可能需要再次提及以保持连贯性。 需要确保回答正确,比如是否有不同的参数选项,比如IMMEDIATE关键字在KILL SESSION中的作用,以及DISCONNECT SESSION是否支持类似选项。可能还需要提到对连接方式的影响,比如共享服务器和专用服务器的不同处理方式。 另外,用户可能关心在实际应用中何时使用哪个命令,以及潜在的风险,比如资源未释放,或者事务回滚时间过长的问题。需要结合这些实际应用场景进行说明,帮助用户理解在不同情况下如何选择适合的命令。 最后,总结部分要简明扼要,强调主要区别和推荐的使用场景,确保用户能够快速抓住重点。同时,避免使用过于技术化的术语,保持语言通俗易懂,但又不失专业性。</think>在Oracle数据库中,`ALTER SYSTEM DISCONNECT SESSION`和`ALTER SYSTEM KILL SESSION`都可以终止会话,但两者的实现机制、行为细节和适用场景存在显著差异。以下是详细对比: --- ### **1. 核心区别概述** | **特性** | **`ALTER SYSTEM KILL SESSION`** | **`ALTER SYSTEM DISCONNECT SESSION`** | |----------------------------|---------------------------------------------|---------------------------------------------| | **目标行为** | 标记会话为“KILLED”,由PMON逐步清理 | 直接终止会话的物理连接(如TCP连接) | | **事务处理** | 未提交事务由PMON回滚,回滚可能耗时 | 立即终止连接,事务回滚由PMON接管(同KILL) | | **会话状态** | 会话状态变为`KILLED`,进程可能残留 | 会话状态变为`SNIPED`,进程立即终止 | | **适用连接类型** | 所有连接类型(专用/共享服务器) | **仅适用于专用服务器(Dedicated Server)** | | **资源释放速度** | 较慢(依赖PMON调度) | 较快(直接断开连接) | --- ### **2. 工作机制详解** #### **(1) `ALTER SYSTEM KILL SESSION`** - **语法**: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#' [IMMEDIATE]; ``` - **行为**: - 将会话标记为`KILLED`,PMON后台进程随后回收会话资源并回滚未提交事务。 - 如果使用`IMMEDIATE`选项: - 立即释放会话持有的锁(Locks)和闩(Latches)。 - 但事务回滚仍需PMON完成,可能仍需等待。 - 对共享服务器(Shared Server)模式同样有效。 #### **(2) `ALTER SYSTEM DISCONNECT SESSION`** - **语法**: ```sql ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION [IMMEDIATE]; ``` - **行为**: - **`POST_TRANSACTION`**:等待当前事务提交或回滚后再断开连接(安全但可能延迟)。 - **`IMMEDIATE`**:直接终止物理连接(如TCP连接),事务回滚由PMON接管。 - **仅适用于专用服务器**:依赖操作系统进程(如`oracle.exe`或`ora_pmon_`进程)的直接终止。 --- ### **3. 使用场景对比** | **场景** | **推荐命令** | **原因** | |----------------------------|--------------------------------------------|-------------------------------------------| | 终止共享服务器模式的会话 | `KILL SESSION` | `DISCONNECT SESSION`不支持共享服务器 | | 快速释放连接(如网络问题) | `DISCONNECT SESSION ... IMMEDIATE` | 直接断开TCP连接,无需等待PMON调度 | | 确保事务完整性终止 | `DISCONNECT SESSION ... POST_TRANSACTION` | 等待事务结束后才断开,避免强制回滚 | | 处理长时间未提交的事务 | `KILL SESSION` + 监控回滚进度 | PMON接管回滚,可跟踪剩余时间 | --- ### **4. 注意事项** 1. **事务回滚不可避免**: - 无论使用哪个命令,**未提交的事务一定会回滚**(依赖PMON和UNDO表空间)。 - 大事务回滚可能导致性能问题,需监控`V$SESSION_LONGOPS`。 2. **残留进程问题**: - `KILL SESSION`后,操作系统进程可能仍存在(状态为`<defunct>`),需手动清理。 - `DISCONNECT SESSION`更彻底终止进程,减少残留风险。 3. **权限与影响**: - 需`ALTER SYSTEM`权限。 - 频繁使用可能影响数据库稳定性(如PMON资源竞争)。 --- ### **5. 示例与验证** - **终止会话后检查状态**: ```sql -- 查看会话状态 SELECT sid, serial#, status, type, program FROM v$session WHERE sid = <目标SID>; ``` - `KILL SESSION`后状态为`KILLED`。 - `DISCONNECT SESSION`后状态为`SNIPED`,且进程从操作系统消失。 --- ### **6. 总结** - **`KILL SESSION`**: 更通用,支持所有连接类型,依赖PMON逐步释放资源,适合大多数场景。 - **`DISCONNECT SESSION`**: 更激进,直接终止物理连接,仅限专用服务器模式,适合需要快速断开连接且不关心事务完成的场景。 **建议**: - 优先使用`KILL SESSION`,尤其是生产环境。 - 仅在明确需要快速断开专用服务器连接时使用`DISCONNECT SESSION`,并谨慎选择`POST_TRANSACTION`或`IMMEDIATE`选项。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值