怎麼殺掉特定的資料庫會話

guyuexue發表於2007-11-21

Alter system kill session 'sid,serial#';
或者
alter system disconnect session 'sid,serial#' immediate;
在win上,還可以採用oracle提供的orakill殺掉一個執行緒(其實就是一個Oracle程式)
在Linux/Unix上,可以直接利用kill殺掉資料庫程式對應的OS程式

一、問題的提出
很多的時候我們迅速的殺掉Oralcle的一些session,理由大體如下:

1、 一些時候,由於我們的資料量很大,相應的事務大並且多,在做shutdown immediate的時候會花費好多的時間,而我們卻想用shutdown immediate的方式,而又要把資料庫迅速的shutdown下來。

2、 我們的應用可能使用了會話控制,即在應用的層面控制了一些使用者的連線的數量。但有時可能網路發生的瞬斷,從而就產生了一些死程式,他們的狀態為Inactive的狀態。當我們用alter system kill session ‘sid,serial#’進行清除時,這些session的狀態又變成了killed,這些就由Pmon程式來慢慢進行清除了,而你恰恰又是個急脾氣。

3、 系統忽然慢了現來,你發現是某個session在做怪,想迅速把它迅速結束掉。

二、處理方法
其實處理方法很簡單,是被一些人稱為“謀殺”的一種方法。因為一個session會對應著作業系統中相應的一個程式(process),我們不使用Alter system kill session這種方式了,取而代之則是kill的方式,當session的後臺程式被殺掉了,便會促使懶散的Pmon程式迅速進行清理工作。

1、 以一個session做以示例,

a、 找到你要殺掉的那個session, 並記下paddr

select sid, username, paddr, status from v$session
where username = '使用者名稱' and
status = 'INACTIVE';

b、 找到這個session所對應的spid

select * from v$process where addr = '上面查尋的paddr';
c、 殺掉spid所標識的那個程式

如果你的Oracle是在Unix平臺上的,可以用kill。

$kill spid

如果你的Oracle是在windown平臺上的,有一些的不同,因為windown是以thead來代替process的,需要用到sid和spid兩個值,所用的命令也由kill替換為Orakill,格式為rakill sid spid

C:>orakill sid  spid

d、 再查一下v$session,看會話在不在了。

2、 如何謀殺掉所有的Oracle的使用者的程式呢?

a、windows的環境,執行如下圖中的SQL,並把結果存成.bat的檔案,比如kill.bat, 執行一下kill.bat就可以了。

select 'orakill '||sid||' '||spid as thread from
sys.v_$process p, sys.v_$session s
where sid > 6 and
p.addr = s.paddr ;


b、 Unix的環境相對來說就簡單多了,執行如下的命令就可以了

$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill
然後你再shutdown immediate就很快的了。


有一些死鎖程式,異常退出後用
alter system kill session 'sid, serial#';無法釋放會話
可從作業系統直接處理。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/503782/viewspace-983105/,如需轉載,請註明出處,否則將追究法律責任。

相關文章