1、概念oracleRAC集群死锁进程是针对对应实例的,查询的时候需要用到gv$全局试图
2、查询数据库中所有会话信息
SQL> select saddr,sid,serial#,paddr,username,status from gv$session; SADDR SID SERIAL# PADDR USERNAME STATUS ---------------- ---------- ---------- ---------------- ------------------------------ -------- 000000025C233B00 27 33353 000000025F1D1FC8 ETL INACTIVE 000000025C23A608 37 11448 000000025F1D27B0 SYS ACTIVE 000000025C24BC50 63 54311 000000025F1D5F08 SYS ACTIVE
3、发送结束会话的命令
SQL> alter system kill session '27,33353' IMMEDIATE;
4、再次查看会话状态 killd
SQL> select saddr,sid,serial#,paddr,username,status from gv$session; SADDR SID SERIAL# PADDR USERNAME STATUS ---------------- ---------- ---------- ---------------- ------------------------------ -------- 000000025C233B00 27 33353 000000025C21A0B0 ETL KILLED
如下所示,我杀掉了其中两个会话后,这两个会话的地址都变为000000025C21A0B0了(请见PADDR列)。当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断。 然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间. 如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON 来清除该session.这被作为一次异常中断处理.
5、直接到实例所在的服务器杀掉对应的进程(快速结束会话)
SQL> select spid from gv$process where addr in (select paddr from gv$session where sid='1539')
------------------------------------------------总结------------------------------------------------------------------
1、找到需要kill的会话 select saddr,sid,serial#,paddr,username,status from gv$session; 2、结束会话 alter system kill session '27,33353' IMMEDIATE; 3、需要快速再找到进程,对应实例上去结束进程 kill -9 spid select spid from gv$process where addr in (select paddr from gv$session where sid='1539')