你可以考慮使用在操作系統(tǒng)層面來殺掉客戶端會話的連接進程,這樣資源馬上就可以釋放掉,如果只是在數(shù)據(jù)庫級別的話,即便是管理員殺掉會話,那么v$session里面也不過是顯示killed狀態(tài),而不是真正的釋放掉,同時如果此時實際的連接數(shù)量達到參數(shù)session設(shè)定數(shù)量上線的話,新的連接將會報錯無法連接,直到資源釋放才可以。
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團成都企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。核心團隊均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗,服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:工商代辦等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗,同時也獲得了客戶的一致稱揚!
有時,Oracle中造成一些表被死鎖或者會話異常退出,如執(zhí)行了更新記錄操作后,既沒有commit也沒有rollback,網(wǎng)絡(luò)就斷開了,也會造表或記錄被鎖住,待到超時后才會被解開,那樣都會造成應(yīng)用操作被阻塞。
可以以O(shè)ralce管理員權(quán)限用戶登錄Oracle數(shù)據(jù),查詢到被鎖的對象,然后殺除指定的會話。
用下面的語句查詢被鎖的對象,可以帶上更多約束條件,如schemaname等更精確的匹配。
SELECT
a.object_id, a.session_id, b.object_name, c.*
FROM
v$locked_object a, dba_objects b, v$session c
WHERE
a.object_id = b.object_id
AND
a.SESSION_ID = c.sid(+)
殺Seesion的SQL語句語法如下:
alter system kill session 'sid, serial#'
如上面查出來的一條記錄的sid是53, serial#為663,就執(zhí)行以下的語句 alter system kill session '53,663'
如果要一次性殺死多個會話,一個一個填寫sid和serial#十分的繁瑣,應(yīng)該在查詢被鎖對象的同時拼湊出多條的殺會話語句,以分號分隔,一起復(fù)制下來,然后就可以批量的執(zhí)行了。
拼湊kill語句的方式如下,下面加了一個過濾條件和一個排序,殺除真正關(guān)心的表,并且著重注意超時時間過長的會話。
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||''';',
a.object_id, a.session_id, b.object_name, c.*
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
AND schemaname = 'Unmi'
ORDER BY logon_time
你遇到過下面類似的情況嗎?一個用戶進程長期占用資源而不釋放,導(dǎo)致Oracle進程占用了系統(tǒng)的大量資源,Oralce系統(tǒng)的效率變得很低。如果簡單的關(guān)閉重啟Oracle
實例,勢必影響所有的用戶。有沒有辦法僅僅只Kill掉有問題的用戶進程而不用關(guān)閉整個Oralce實例呢?答案是可以的,使用Oralce提供的一個名叫Orakill的工具。
大家都知道,Windows
2000是一個基于線程的操作系統(tǒng),而不是象Unix、Linux那樣基于進程的操作系統(tǒng)。整個Oracle的后臺進程、用戶進程等,在Windows
2000環(huán)境下,都包含在ORACLE.EXE這單獨的一個體系進程中了,通過查看’任務(wù)管理器’――’進程’就可以看到。如果你不是使用MTS多線程服
務(wù)器的模式,如果你Kill掉ORACLE.EXE這個進程,將導(dǎo)致整個Oracle實例關(guān)閉,如同使用Shutdown
abort命令一樣。
由于Windows自己沒有提過一個專門用來Kill掉單個線程的工具,因此Oracle從Oracle7.3.3.6開始,自己提供了一個基于字符界面的用來在Windows環(huán)境下強制Kill掉一個線程的工具――Orakill。
在NT中如果使用alter system kill
session
'sid,serial#'來清楚會話,在執(zhí)行之后該會話的狀態(tài)會變?yōu)镵ILLED,但是有時候這個狀態(tài)會保持很長時間,直到最后被清除。
如果想更快地從內(nèi)存中清理這個會話,那么可以在使用了alter
system之后,再在NT中使用Orakill實用程序(該程序隨Oracle數(shù)據(jù)庫同時安裝)直接清除該會話的線程。
Orakill的使用方法如下:
Dos提示符下:orakill sid thread
說明: sid Oracle的Sid號
thread Oracle的線程id號
首先取得被殺掉的會話的Thread Number:
SET pagesize 100
SET linesize 100
COLUMN Program format a20
SELECT s.sid AS "Sid", s.serial# AS "Serial#", p.spid AS
"ThreadID",
s.osuser
AS "OSUser", s.program AS "Program"
FROM v$process p, v$session s
WHERE p.addr = s.paddr(+)
ORDER BY s.sid
輸出可能如下:
Sid Serial# ThreadID OSUser Program
--- ------- -------- ------ -------
...
10 809 102 User01 Prog.exe
11 345 333 SeUser App.exe
15 719 422 User01 Prge.exe
20 345 123 SeUs Acco.exe
555
324
然后在命令行窗口執(zhí)行Orakill命令
例:orakill ORCL 555
orakill ORCL 324
orakill的命令幫助如下:
C:orakill
Usage: orakill sid thread
where sid = the Oracle instance to target
thread = the thread id of the thread to kill
The thread id should be retrieved from the spid column of a query
such
as:
SELECT spid, osuser, s.program
FROM v$process p, v$session s
WHERE p.addr = s.paddr;
需要注意的是,如果你Kill掉的是Oracle的核心后臺線程(DBWR, LGWR, SMON or
PMON),將導(dǎo)致Oracle實例關(guān)閉。檢查Oracle的核心后臺線程的方法如下:
sql:Select vb.name NOME, vp.programe PROCESSNAME,
vp.spid THREADID, vs,sid SID
sql:From v$session vs, v$process vp, v$bgprocess
vb
sql:Where vb.addr
‘00’ and
sql:vb.paddr = vp.addr and
sql:vp.addr = vs.paddr
查詢結(jié)果如下:
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.
特別提醒,這里的sid指的是oracle的實例號
即
select instance from v$instance;
而且orakill只能用于oracle實例安裝在windows上的時候
用 shutdown immdiate;\x0d\x0a\x0d\x0aSHUTDOWN NORMAL:不允許新的連接、等待會話結(jié)束、等待事務(wù)結(jié)束、做一個檢查點并關(guān)閉數(shù)據(jù)文件。啟動時不需要實例恢復(fù)。\x0d\x0aSHUTDOWN TRANSACTIONAL:不允許新的連接、不等待會話結(jié)束、等待事務(wù)結(jié)束、做一個檢查點并關(guān)閉數(shù)據(jù)文件。啟動時不需要實例恢復(fù)。\x0d\x0aSHUTDOWN IMMEDIATE:不允許新的連接、不等待會話結(jié)束、不等待事務(wù)結(jié)束、做一個檢查點并關(guān)閉數(shù)據(jù)文件。沒有結(jié)束的事務(wù)是自動rollback的。啟動時不需要實例恢復(fù)。 \x0d\x0aSHUTDOWN ABORT:不允許新的連接、不等待會話結(jié)束、不等待事務(wù)結(jié)束、不做檢查點且沒有關(guān)閉數(shù)據(jù)文件。啟動時自動進行實例恢復(fù)。
新聞標(biāo)題:如何關(guān)閉oracle會話,oracle無法終止當(dāng)前會話
當(dāng)前網(wǎng)址:http://aaarwkj.com/article26/dsiisjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、自適應(yīng)網(wǎng)站、虛擬主機、標(biāo)簽優(yōu)化、企業(yè)建站、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)