使用者通知在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就像一個工廠,有許多的機器,而線程則工人,負責操作執行。