在Windows中刪除Oracle的Session

 使用者通知在Oracle DB的測試機中,有一支HR的客製程式一直跑不出來,所以把它刪掉。

首先用SQL來找出該程式的SID、SERIAL、SPID等訊息:

SQL> select vs.sid,vs.serial#,vp.spid,vs.*,vp.* from v$session vs,v$process vp where vp.addr=vs.paddr;

找到的SID:519、SERIAL:17202、SPID:23903,先在DB將其Session刪掉:

SQL> alter system kill '519,17202';

觀察刪除Session的狀態,一直處在KILLED,如果是UNIX的系統,可以下達指令kill -9 23903來刪除,這樣就可以了。

但是這次案例中,系統是Windows,用資源管理器或工作管理員是找不到SPID:23903


與UNIX的進程(thread)管理不同,Windows是基於線程(process)管理的作業系統,所以呈現的是process id。

因為是process,所以全都包含在ORACLE.EXE,如果刪除這個Process,會把Oracle背景程式等一併刪掉,將導致Oracle DB整個當掉。

為此Oracle DB預設有提供一個專為Windows操作的指令:orakill,利用這個Oracle的指令,可以安全地將相應的thread刪掉。

orakill的語法如右:orakill <SID> <THREAD ID>

<SID>是指Oracle instance target,不是v$session的SID;<THREAD ID>指的就是Oracle的SPID,所以在此案例中,我們可以用下列指令來刪除Windows的thread

select instance_name from v$instance; => 例如找到的是dbtest

C:> orakill dbtest 23903

需要注意的是,如果你Kill掉的是Oracle的背景程式(DBWR、LGWR、SMON、PMON等),將導致Oracle當掉,檢查Oracle的背景程式的SQL如下:

SQL> select vs.sid,vs.serial#,vp.spid,vb.name,vp.program
             from  v$session vs, v$process vp, v$bgprocess vb
             where vb.paddr = vp.addr 
             and vp.addr = vs.paddr
             and vb.paddr <> '00';

進程Process:

就是載入記憶體且執行的program。Process是作業系統分配資源(CPU Time、Memory…等)的最小單位。


線程Thread:

Thread可以想像成存在於 process 裡面,所以一個Porcess會有至少一個或多個Thread。

Thread 是作業系統能夠進行運算排程的最小單位,實際執行任務的並不是進程,而是進程中的線程,

一個進程有可能有多個線程,而多個線程可以共用進程的系統資源,Process就像一個工廠,有許多的機器,而線程則工人,負責操作執行。