oracle快速彻底杀掉session
今天开发反馈说,执行某个程序update的时候hang住,查看了一下是个小表,只有3000多行数据。第一反应是有锁,把该实例的所有session kill后,执行update还是hang住,单独执行了下where条件后面的select很快。于是觉得应该是在2节点上还有lock,于是执行查询: select * from gv$lock where id1=383105; SQL> select * from gv$lock where id1=383105; INST_ID ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK 2 0000000110AF61B0 0000000110AF6210 1333 TM 383105 0 3 0 6819 2 果然,2节点上还有一个session持有锁。 连接到2节点,执行查询: SQL> select sid,serial#,osuser from v$session where sid=1333; SID SERIAL# OSUSER 1333 22559 6005821 alter system kill session ‘1333,22559‘; 杀了会话后,再查询,发现1333的session还存在: SQL> select sid,osuser from v$session where sid=1333; SID SERIAL# OSUSER 1333 22559 6005821 于是想从系统层kill,可是通过以下sql查询不到1333的spid select p.pid,p.spid,s.sid,s.serial# from v$process p,v$session s where s.paddr=p.addr and s.sid=1333; 查询后发现,当在Oracle中kill session以后,Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断。 然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间. 如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON 来清除该session.这被作为一次异常中断处理. 根据以下sql找到之前的paddr: select p.addr from v$process p where pid <> 1 07000107C8C050F8 根据v$process的addr找到spid: select * from v$process where addr in (‘07000107C8C050F8‘,‘07000107DCC19D88‘); 然后找到系统进程号,杀掉就好了。由于部分过程没有保留下执行结果,就只有记录下sql了。 [email?protected]:] ps -ef|grep 8847870 测试过程还可以查看另一文章:https://www.cnblogs.com/kerrycode/p/4034231.html (编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |