orakill和alter system kill session的区别
原文出處:http://blog.csdn.net/ouzhiyi_linux_oracle/archive/2009/04/16/4081739.aspx?
一個用戶進程偶爾會掛起或占用過多資源而拒絕其它會話。如果 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;
select 'alter system kill session ',''''||trim(t2.sid)||','||trim(t2.serial#)||''';'
? from v$locked_object t1,
?????? v$session t2
?where t1.session_id=t2.sid
?order by t2.logon_time;
這個查詢將返回數據庫用戶名、操作系統用戶名、會話 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 <sid> <spid>
orakill ORCL 2760
"Kill of thread id 2760 in instance ORCL successfully signalled[sic]."
應該只有在不能訪問數據庫來執行ALTER SYSTEM KILL SESSION 的情況才使用orakill。如果意外結束了一個必要的后臺進程,比如 PMON,那么很可能會導致數據庫崩潰。新手永遠不要這樣做。
Orakill的使用方法如下:
??????? Dos提示符下:>orakill sid thread
??????? 說明: sid Oracle的Sid號
????????????????? thread? Oracle的線程id號
在Sql*plus工具里面可以查詢到Oracle的線程號
??????? sql:>Select p.spid THREADID, s.osuser, s.program
???????????? From v$process p, v$session s
???????????? Where p.addr = s.paddr
結果如下:
THREADID? OSUSER????????????????? PROGRAM
--------- ----------------------- -----------------------------
169?????? SYSTEM????????????????? ORACLE.EXE
215?????? SYSTEM????????????????? ORACLE.EXE
280?????? SYSTEM????????????????? ORACLE.EXE
267?????? SYSTEM????????????????? ORACLE.EXE
287?????? SYSTEM????????????????? ORACLE.EXE
288?????? SYSTEM????????????????? ORACLE.EXE
271?????? SYSTEM????????????????? ORACLE.EXE?
282?????? SYSTEM????????????????? ORACLE.EXE?
239?????? PROD_NTdjones????????? SVRMGRL.EXE
281?????? SSMITH-PCssmith??????? SQLPLUSW.EXE
12 rows selected.
需要注意的是,如果你Kill掉的是Oracle的核心后臺線程(DBWR, LGWR, SMON or PMON),將導致Oracle實例關閉。檢查Oracle的核心后臺線程的方法如下:
sql:>Select vb.name NOME, vp.programe PROCESSNAME, vp.spid THREADID, vs.sid SID
?????? From v$session vs, v$process vp, v$bgprocess vb
????? Where vb.addr <> ‘00’
??????? and vb.paddr = vp.addr
??????? and vp.addr = vs.paddr
查詢結果如下:
NOME? PROCESSNAME???????????????????????? THREADID? SID
----- ----------------------------------- --------- ------
PMON? ORACLE.EXE????????????????????????? 169?????? 1
DBW0? ORACLE.EXE????????????????????????? 215?????? 2
LGWR? ORACLE.EXE????????????????????????? 280?????? 3
CKPT? ORACLE.EXE????????????????????????? 267?????? 4
SMON? ORACLE.EXE????????????????????????? 287?????? 5
RECO? ORACLE.EXE????????????????????????? 288?????? 6
SNP0? ORACLE.EXE????????????????????????? 271?????? 7
SNP1? ORACLE.EXE????????????????????????? 282?????? 8
8 rows selected.
window xp + oracle 9.2.0.1
================
orakill的用法
================
SQL> SELECT spid, osuser, s.program,sid
?????? FROM v$process p, v$session s
????? WHERE p.addr=s.paddr;
SPID???????????????????? OSUSER?????????????? PROGRAM??????????????? SID
------------------------ -------------------- --------------- ----------
6928???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 1
5272???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 2
7008???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 3
6588???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 4
6780???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 5
6128???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 6
6740???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 7
6684???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 8
7092???????????????????? SYSTEM?????????????? ORACLE.EXE?????????????? 9
6272???????????????????? SYSTEM?????????????? ORACLE.EXE????????????? 10
4760???????????????????? lifeng.fang????????? sqlplus.exe???????????? 12
SPID???????????????????? OSUSER?????????????? PROGRAM??????????????? SID
------------------------ -------------------- --------------- ----------
6484???????????????????? lifeng.fang????????? sqlplus.exe???????????? 11
4284
語法:orakill 實例名 spid? (在win上是線程號)
SQL> host orakill charset 6484;
Kill of thread id 6484 in instance charset successfully signalled.
spid是os進程ID
pid是Oracle process ID
總結
以上是生活随笔為你收集整理的orakill和alter system kill session的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle中minus
- 下一篇: oracle错误号大全(查询ora错误号