干掉标记为KILLED的session
同事kill掉一个进程 521,查询状态:
select * from v$session where sid=521;
状态是:KILLED,但是SESSION还是没有释放锁住的资源,
查询 v$process ,得不到 SPID系统进程号,原因是 kill掉 session的SID和SERIAL#后,v$session的PADDR发生了变化,只能通过下列sql查询新的在v$process中而不在v$session中的进程:
select p.addr from v$process p where pid <>1
minus
select s.paddr from v$session s
结果是 v$process 的 addr地址,确认是否含有系统oracle的进程:
sekect spid,username,terminal,program,background from v$process
where addr in ('刚才查询出来的结果')
核对结果,在操作系统级执行: kill -9 XXXX, 再次查询:
select * from v$session where status='KILLED';
如果还是没有解决,就用最后一招,
alter system set events = ''immediate trace name flush_cache''(9i);
alter system flush buffer_cache(10g)
最后的这个方法会释放DB CACHE里的所有缓存,数据库会在开始的一段时间比较慢,运行一段时间后就会正常。