隨筆-28  評論-15  文章-81  trackbacks-0
          在Oracle數據庫中,可以通過kill session的方式來終止一個進程,其基本語法結構為:

          alter system kill session 'sid,serial#' ;

           被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.

          我們發現當一個session被kill掉以后,該session的paddr被修改,如果有多個session被kill,那么多個session
          的paddr都被更改為相同的進程地址

          在這種情況下,很多時候,資源是無法釋放的,我們需要查詢spid,在操作系統級來kill這些進程.

          但是由于此時v$session.paddr已經改變,我們無法通過v$session和v$process關聯來獲得spid

          那還可以怎么辦呢?

          我們來看一下下面的查詢:

          SELECT P.ADDR FROM V$PROCESS P WHERE PID <> 1
          MINUS
          SELECT S.PADDR FROM V$SESSION S;

          現在我們獲得了進程地址,就可以在v$process中找到spid,然后可以使用Kill或者orakill在系統級來殺掉這些進程.

          實際上,應該是:

          當在Oracle中kill session以后, Oracle只是簡單的把相關session的paddr 指向同一個虛擬地址.

          此時v$process和v$session失去關聯,進程就此中斷.

          然后Oracle就等待PMON去清除這些Session.所以通常等待一個被標記為Killed的Session退出需要花費很長的時間.

          如果此時被Kill的process,重新嘗試執行任務,那么馬上會收到進程中斷的提示,process退出,此時Oracle會立即啟動PMON
          來清除該session.這被作為一次異常中斷處理.

          相關:
          orakill sid spid 其中sid為實例名,spid為線程號
          不過我運行時總是報錯:
          Could not attach to Oracle instance sid名

          posted on 2008-10-09 17:13 譚明 閱讀(1022) 評論(1)  編輯  收藏 所屬分類: Oracle

          評論:
          # re: Oracle session kill[未登錄] 2008-12-04 13:21 | test
          orakill sid spid sid 要改成你自己的數據庫的 sid的名字  回復  更多評論
            
          主站蜘蛛池模板: 彭泽县| 綦江县| 罗源县| 宁阳县| 水城县| 广南县| 敦化市| 浪卡子县| 广河县| 将乐县| 昭苏县| 延庆县| 阿拉善左旗| 徐汇区| 新邵县| 晋宁县| 德保县| 阳山县| 阳信县| 金山区| 香港| 鸡东县| 舒兰市| 江达县| 偃师市| 贡嘎县| 苏州市| 大荔县| 泰安市| 乡城县| 乌兰察布市| 怀柔区| 湖北省| 渭源县| 鸡东县| 沂源县| 县级市| 贵阳市| 鹤山市| 防城港市| 宁南县|