oracle alter system kill,ALTER SYSTEM KILL SESSION详解
一個(gè)用戶進(jìn)程偶爾會(huì)掛起或占用過多資源而拒絕其它會(huì)話。如果DBA依然能夠訪問數(shù)據(jù)庫,她通常可以發(fā)出以下查詢:
select s.username, s.osuser,
s.sid, s.serial#, p.spidfrom
v$session s,v$process p
where s.paddr = p.addrand
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;
這個(gè)查詢將返回?cái)?shù)據(jù)庫用戶名、操作系統(tǒng)用戶名、會(huì)話 ID,序列號(hào)和系統(tǒng)進(jìn)程 ID(SPID)。然后,DBA
用戶就可以發(fā)出以下命令(前面的查詢返回的使用 SID 和SERIAL# 信息):ALTER SYSTEM KILL SESSION
'sid,serial#';
ALTER SYSTEM KILL SESSION '9,203';使用這條語句有兩個(gè)問題。
第一:分配給這個(gè)進(jìn)程的任何鎖或資源在會(huì)話完全超時(shí)之前不會(huì)被釋放。
第二:查詢和 kill 命令需要能夠訪問數(shù)據(jù)庫。如果一個(gè)進(jìn)行失去控制,那么數(shù)據(jù)庫訪問可能會(huì)出現(xiàn)問題。
在一個(gè) UNIX 數(shù)據(jù)庫中,下一步是 ps 命令輸出的 UNIX 提示中定位進(jìn)程(同樣是查找 OSUSER 和 SPID 等
ID)然后使用 kill -9 spid 結(jié)束失控的后臺(tái)進(jìn)程。然而,在 Windows 中,只有一個(gè)進(jìn)程
ORACLE.EXE,而且用戶連接是在 Windows 線程中處理的,而不在進(jìn)程中處理的。如果使用 Windows 任務(wù)管理器結(jié)束
Oracle 線程,就有可能影響所有用戶和后臺(tái)線程,并導(dǎo)致數(shù)據(jù)庫崩潰。
出于這些原因,Oracle 在Oracle Home/bin 目錄下提供了一個(gè) orakill.exe
命令,這個(gè)命令的參數(shù)與ALTER SYSTEM KILL SESSION
相同,但是不要求數(shù)據(jù)庫連接。要定位一個(gè)特定的線程,需要尋找一個(gè)能夠顯示屬于一個(gè)進(jìn)程的所有線程的程序。Windows
任務(wù)管理器只能顯示線程數(shù)和進(jìn)程。你需要從微軟的資源工具包中尋找一個(gè)用于 Windows 2000 和 NT
的工具程序,比如免費(fèi)的QuickSlice,或者Qslice.exe(該工具是基于 Windows
的),或者PStat(Pstat.exe 是一個(gè)命令行工具)。簡單地在 orakill 命令后輸入線程 ID(以十進(jìn)制表示)和 SID
即可:
orakill
orakill ORCL 2760
"Kill of
thread id 2760 in instance ORCL successfully signalled[sic]."
應(yīng)該只有在不能訪問數(shù)據(jù)庫來執(zhí)行ALTER SYSTEM KILL SESSION
的情況才使用orakill。如果意外結(jié)束了一個(gè)必要的后臺(tái)進(jìn)程,比如
PMON,那么很可能會(huì)導(dǎo)致數(shù)據(jù)庫崩潰。新手永遠(yuǎn)不要這樣做。
Orakill的使用方法如下:Dos提示符下:>orakill sid
thread說明: sid
Oracle的Sid號(hào)threadOracle的線程id號(hào)
在Sql*plus工具里面可以查詢到Oracle的線程號(hào)sql:>Select p.spid THREADID, s.osuser,
s.programFrom
v$process p, v$session sWhere p.addr = s.paddr
結(jié)果如下:
THREADIDOSUSERPROGRAM
--------- -----------------------
-----------------------------
169SYSTEMORACLE.EXE
215SYSTEMORACLE.EXE
280SYSTEMORACLE.EXE
267SYSTEMORACLE.EXE
287SYSTEMORACLE.EXE
288SYSTEMORACLE.EXE
271SYSTEMORACLE.EXE282SYSTEMORACLE.EXE239PROD_NTdjonesSVRMGRL.EXE
281SSMITH-PCssmithSQLPLUSW.EXE
12 rows selected.
需要注意的是,如果你Kill掉的是Oracle的核心后臺(tái)線程(DBWR, LGWR, SMON or
PMON),將導(dǎo)致Oracle實(shí)例關(guān)閉。檢查Oracle的核心后臺(tái)線程的方法如下: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
查詢結(jié)果如下:
NOMEPROCESSNAMETHREADIDSID
----- ----------------------------------- --------- ------
PMONORACLE.EXE1691
DBW0ORACLE.EXE2152
LGWRORACLE.EXE2803
CKPTORACLE.EXE2674
SMONORACLE.EXE2875
RECOORACLE.EXE2886
SNP0ORACLE.EXE2717
SNP1ORACLE.EXE2828
8 rows selected.
window xp + oracle 9.2.0.1
================
orakill的用法
================SQL> SELECT spid, osuser,
s.program,sidFROM
v$process p, v$session sWHERE
p.addr=s.paddr;
SPIDOSUSERPROGRAMSID
------------------------ -------------------- ---------------
----------
6928SYSTEMORACLE.EXE1
5272SYSTEMORACLE.EXE2
7008SYSTEMORACLE.EXE3
6588SYSTEMORACLE.EXE4
6780SYSTEMORACLE.EXE5
6128SYSTEMORACLE.EXE6
6740SYSTEMORACLE.EXE7
6684SYSTEMORACLE.EXE8
7092SYSTEMORACLE.EXE9
6272SYSTEMORACLE.EXE10
4760lifeng.fangsqlplus.exe12
SPIDOSUSERPROGRAMSID
------------------------ -------------------- ---------------
----------
6484lifeng.fangsqlplus.exe11
4284
語法:orakill 實(shí)例名 spid(在win上是線程號(hào))
SQL> host orakill charset 6484;
Kill of thread id 6484 in instance charset successfully
signalled.
spid是os進(jìn)程ID
pid是Oracle process ID
根據(jù)蓋國強(qiáng)的猜測
當(dāng)在Oracle中kill session以后, Oracle只是簡單的把相關(guān)session的paddr
指向同一個(gè)虛擬地址.此時(shí)v$process和v$session失去關(guān)聯(lián),進(jìn)程就此中斷.然后Oracle就等待PMON去清除這些Session.所
以通常等待一個(gè)被標(biāo)記為Killed的Session退出需要花費(fèi)很長的時(shí)間.如果此時(shí)被Kill的process,重新嘗試執(zhí)行任務(wù),那么馬上會(huì)收到進(jìn)
程中斷的提示,process退出,此時(shí)Oracle會(huì)立即啟動(dòng)PMON來清除該session.這被作為一次異常中斷處理.
具體的實(shí)驗(yàn)例子讀者可以參考
http://www.eygle.com/faq/Kill_Session.htm
當(dāng)然如果該用戶已經(jīng)沒有使用,例如在決定刪除該用戶的時(shí)候,PMON很可能不回自動(dòng)的去清理這些session則需要手工觸發(fā)PMON執(zhí)行
首先確認(rèn)PMON進(jìn)程是whoSQL> select pid,spid
from v$process p,v$bgprocess b
where b.paddr=p.addr
and name='PMON';
PID SPID
---------- ------------
2?3608
SQL> oradebug wakeup 2已處理的語句
總結(jié)
以上是生活随笔為你收集整理的oracle alter system kill,ALTER SYSTEM KILL SESSION详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看某个端口是否链接超时
- 下一篇: Canvas制作动态进度加载水球