程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 用OraKill結束失控的Oracle進程

用OraKill結束失控的Oracle進程

編輯:Oracle數據庫基礎

一個用戶進程偶爾會掛起或占用過多資源而拒絕其它會話。如果 DBA 依然能夠訪問數據庫,她通常可以發出以下查詢:

select s.username, s.osuser, s.sid, s.serial#, p.spid

from v$session s,v$process p

where s.paddr = p.addr

and s.username is not null;

這個查詢將返回數據庫用戶名、操作系統用戶名、會話 ID,序列號和系統進程 ID(SPID)。然後,DBA 用戶就可以發出以下命令(前面的查詢返回的使用 SID 和SERIAL# 信息):

ALTER SYSTEM KILL SESSION 'sid,serial#';

ALTER SYSTEM KILL SESSION '9,203';

使用這條語句有兩個問題。第一,分配給這個進程的任何鎖或資源在會話完全超時之前不會被釋放。第二,查詢和 kill 命令需要能夠訪問數據庫。如果一個進行失去控制,那麼數據庫訪問可能會出現問題。

在一個 UNIX 數據庫中,下一步是 ps 命令輸出的 UNIX 提示中定位進程(同樣是查找 OSUSER 和 SPID 等 ID)然後使用 kill -9 spid 結束失控的後台進程。然而,在 Windows 中,只有一個進程 ORACLE.EXE,而且用戶連接是在 Windows 線程中處理的,而不在進程中處理的。如果使用 Windows 任務管理器結束 Oracle 線程,就有可能影響所有用戶和後台線程,並導致數據庫崩潰。

出於這些原因,Oracle 在Oracle Home/bin 目錄下提供了一個 orakill.exe 命令,這個命令的參數與ALTER SYSTEM KILL SESSION 相同,但是不要求數據庫連接。要定位一個特定的線程,需要尋找一個能夠顯示屬於一個進程的所有線程的程序。Windows 任務管理器只能顯示線程數和進程。你需要從微軟的資源工具包中尋找一個用於 Windows 2000 和 NT 的工具程序,比如免費的QuickSlice,或者Qslice.exe(該工具是基於 Windows 的),或者PStat(Pstat.exe 是一個命令行工具)。簡單地在 orakill 命令後輸入線程 ID(以十進制表示)和 SID 即可:

orakill

orakill ORCL 2760

"Kill of thread id 2760 in instance ORCL successfully signalled[sic]."

應該只有在不能訪問數據庫來執行ALTER SYSTEM KILL SESSION 的情況才使用orakill。如果意外結束了一個必要的後台進程,比如 PMON,那麼很可能會導致數據庫崩潰。新手永遠不要這樣做。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved