今天对数据库巡查的时候发现有个session已经killed但是oracle很久都没有把资源回收,session标志为killed肯定是有人用alter system kill session 'sid,serial#' 来杀进程了,被kill的进程由于其paddr发生变化,已经不能通过v$session和v$process视图关联来查找spid了,怎么办呢?
首先通过下面sql查找在v$process中存在而不在v$session中存在的进程:
select p.addr from v$process p where pid <> 1
minus
select s.paddr from v$session s;
查询显示结果如下:
ADDR
----------------
C0000005C32975D8
C0000005C3297AE0
C0000005C3297FE8
确认这些进程是否为重要的后台进程:
select spid, username, terminal, program, background from v$process where addr in ('C0000005C32975D8', 'C0000005C3297AE0', 'C0000005C3297FE8');
查询结果:
SPID USERNAME TERMINAL PROGRAM BACKGROUND
------------ -------- ------------------------------ ----------------------------------- ---------------------
6857 oracle UNKNOWN oracle@mgdev (S000)
6859 oracle UNKNOWN oracle@mgdev (D000)
9370 oracle UNKNOWN oracle@mgdev (TNS V1-V3)
可以看到都不是重要的后台进程,前两个是和共享服务器相关的进程,第3个就是要找的进程了,它正好也是通过TNS连上的,执行:
kill -9 9370,然后查询:
select sid, username, program, machine, status from v$session where status='KILLED';
没有返回任何结果,至此处理完毕。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/339291/viewspace-269176/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/339291/viewspace-269176/