iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

IT工作中曾遇到的問題系列 第 27

在Windows中刪除Oracle的Session

  • 分享至 

  • xImage
  •  

使用者通知在Windows平台的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;

在觀察了結果後,發現該客製程式的session是SID:519、SERIAL:17202、SPID:23903,先在DB將其Session刪掉:

SQL> alter system kill '519,17202';

這支被刪除Session一直處在KILLED,如果是UNIX的系統,我會下指令kill -9 23903來刪除,這樣就可以了。

但是這次案例中,系統是Windows,用資源管理器或工作管理員是找不到SPID:23903
https://ithelp.ithome.com.tw/upload/images/20230915/20156403Teh5o4VVIP.png

與UNIX的進程(thread)管理不同,Windows是基於線程(process)管理的作業系統,所以呈現的是process id。
因為是process,所以全都包含在ORACLE.EXE,如果刪除這個Process,會把Oracle背景程式等一併刪掉,將導致Oracle DB整個當掉。

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

orakill的語法如右:orakill

就是Oracle的SID;指的就是Oracle的SPID,所以在此案例中,我們可以用下列指令來刪除Windows的thread

C:> orakill 519 23903

注意的是,如果你Kill掉的是Oracle的背景程式(DBWR、LGWR、SMON、PMON等),將導致Oracle當掉,其檢查Oracle的背景程式的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就像一個工廠,有許多的機器,而線程則工人,負責操作執行。

本篇參考我的Blog:https://blog.twtnn.com/


上一篇
利用nginx + reverse ssh tunnel 架設臨時對外網頁服務
下一篇
利用Edge的webauthn虛擬驗證程式來測試webauthn網頁
系列文
IT工作中曾遇到的問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言