想必大家都遇到过在数据库层面发起“alter system kill session ”(数据库层杀掉会话,不加immediate 关键字)时,经常出现资源无法及时释放、会话一直处于killed 状态的情况。如果这个会话是锁的源头,那么除了等待PMON (进程监视器)来清理之外,没有更好的办法了,而在操作系统层面杀掉进程的方式,基本上是百试百灵。使用系统命令“kill -9 ”杀死进程,系统向该process 进程发出sigkill ,sigkill 信号直接发送给init 进程,终止process 进程。这种方式直接终止了Oracle 会话中对应的操作进程,资源也可以直接释放。 下面就来重点讲解“alter system kill session ”的过程,以及为何“alter system kill session ”杀掉会话之后,查不到处于killed 状态的会话所对应的系统进程spid 。 “alter system kill session ” (不加immediate 关键字)杀掉会话可针对两种场景进行讨论:一是会话状态是active ,二是会话状态是inactive 。使用此命令杀掉处于active 状态的会话时,过程可以简单概括如下:会话在收到kill 信号后进行回滚,此过程不可被中断,直至过程完成,该会话会接收到 ORA-00028: your session has been killed ”信息 ,PMON 清理会话,释放资源。如果1 分钟过后,上述动作未完成,则该会话被标记为killed 状态,若会话拥有的资源未释放 PMON 进程清理会话。 使用此命令杀掉处于inactive 状态的会话时,过程可以简单概括如下:会话在收到kill 信号后被标记为killed 状态,会话拥有的资源未释放,等待PMON 进程清理会话。如果会话再次发出查询信号,会话就会接收到“ORA-00028: your session has been killed ”信息,PMON 清理会话,释放资源。 接下来模拟不加immediate 参数,杀掉会话后状态被标记为killed ,操作系统查不到进程的实验,过程如下: SQL> select username,sid,serial#,paddr,server,status from v$session where username = 'SCOTT'; USERNAME SID SERIAL# PADDR SERVER STATUS---------- ----- ---------- ---------------- --------- --------SCOTT 17 6733 00000000A34C7040 DEDICATED INACTIVESCOTT 158 9177 00000000A34D4998 DEDICATED INACTIVE SQL> select b.sid,b.serial#,c.spid,b.status from v$session b,v$process c where b.paddr = c.addr and b.sid in (17,158); SID SERIAL# SPID STATUS---- ---------- --------- -------- 17 6733 23883 INACTIVE 158 9177 24120 INACTIVE 手动杀掉这两个会话的命令如下: SQL> alter system kill session '17,6733'; SQL> alter system kill session '158,9177'; 再次查询这两个会话的状态,命令及结果如下: SQL> select username,sid,serial#,paddr,server,status from v$session where username = 'SCOTT';USERNAME SID SERIAL# PADDR SERVER STATUS---------- ---- ---------- ---------------- --------- --------SCOTT 17 6733 00000000A3551F18 PSEUDO KILLEDSCOTT 158 9177 00000000A3551F18 PSEUDO KILLED 从代码中我们可以发现,当两个会话的状态为killed 时,会话的paddr 指向同一地址00000000A3551F18 (虚拟地址),此地址在操作系统层面并无对应的spid ,这就是当会话的状态变为killed 之后,使用以下语句查不到spid 的原因,查询示例代码如下所示: SQL> select b.sid,b.serial#,c.spid,b.status from v$session b,v$process c where b.paddr = c.addr and b.sid in (17,158); no rows selected 此时我们就可以使用前文的查询语句,查杀并清理会话, 命令及结果如下: SQL> select 'alter system kill session ''' || c.sid || '' || ',' || c.serial# || ''' immediate;' kill_session from v$session c where status='KILLED';KILL_SESSION-----------------------------------------------alter system kill session '17,6733' immediate;alter system kill session '158,9177' immediate; 因此,在查杀会话时,可以考虑直接使用“alter system kill session 'sid,serial#' immediate ”命令快速清理会话。需要注意的是,在查杀会话之前一定要再三确认信息,千万不要误杀了系统核心进程。
日常运维之TX锁处理(二)
来源:这里教程网
时间:2026-03-03 17:22:48
作者:
编辑推荐:
- 日常运维之TX锁处理(二)03-03
- 高峰期谨慎编译业务对象03-03
- 互联网的大背景下怎么运用线上资源03-03
- 【UNDO】Oracle系统回滚段说明03-03
- ORACLE压力测试03-03
- [20220109]开发不应该这样写SQL语句.txt03-03
- Installing Oracle 9i on OELRHEL 4.8 64bit03-03
- linux和windows操作系统下完全删除oracle数据库03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- ORACLE压力测试
ORACLE压力测试
26-03-03 - 电脑误删内存卡照片如何恢复?(三个步骤)
电脑误删内存卡照片如何恢复?(三个步骤)
26-03-03 - C盘哪些文件可以删除?删除文件看这里
C盘哪些文件可以删除?删除文件看这里
26-03-03 - Oracle Grid Infrastructure for a Standalone Server
- 储存卡误删都能恢复吗?这个方法大家用了都说好
储存卡误删都能恢复吗?这个方法大家用了都说好
26-03-03 - 电脑怎么找回彻底删除的文件?大家都说简单的方法
电脑怎么找回彻底删除的文件?大家都说简单的方法
26-03-03 - 【Oralce漏洞与安全】AHF的Log4j漏洞修复
【Oralce漏洞与安全】AHF的Log4j漏洞修复
26-03-03 - Oracle 21C区块链表
Oracle 21C区块链表
26-03-03 - 聊聊虚拟化和容器对数据库的影响
聊聊虚拟化和容器对数据库的影响
26-03-03 - AS、SAN、NAS三种存储
AS、SAN、NAS三种存储
26-03-03
