你可以考慮使用在操作系統(tǒng)層面來殺掉客戶端會(huì)話的連接進(jìn)程,這樣資源馬上就可以釋放掉,如果只是在數(shù)據(jù)庫級(jí)別的話,即便是管理員殺掉會(huì)話,那么v$session里面也不過是顯示killed狀態(tài),而不是真正的釋放掉,同時(shí)如果此時(shí)實(shí)際的連接數(shù)量達(dá)到參數(shù)session設(shè)定數(shù)量上線的話,新的連接將會(huì)報(bào)錯(cuò)無法連接,直到資源釋放才可以。
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)成都企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:工商代辦等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致稱揚(yáng)!
有時(shí),Oracle中造成一些表被死鎖或者會(huì)話異常退出,如執(zhí)行了更新記錄操作后,既沒有commit也沒有rollback,網(wǎng)絡(luò)就斷開了,也會(huì)造表或記錄被鎖住,待到超時(shí)后才會(huì)被解開,那樣都會(huì)造成應(yīng)用操作被阻塞。
可以以O(shè)ralce管理員權(quán)限用戶登錄Oracle數(shù)據(jù),查詢到被鎖的對(duì)象,然后殺除指定的會(huì)話。
用下面的語句查詢被鎖的對(duì)象,可以帶上更多約束條件,如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'
如果要一次性殺死多個(gè)會(huì)話,一個(gè)一個(gè)填寫sid和serial#十分的繁瑣,應(yīng)該在查詢被鎖對(duì)象的同時(shí)拼湊出多條的殺會(huì)話語句,以分號(hào)分隔,一起復(fù)制下來,然后就可以批量的執(zhí)行了。
拼湊kill語句的方式如下,下面加了一個(gè)過濾條件和一個(gè)排序,殺除真正關(guān)心的表,并且著重注意超時(shí)時(shí)間過長的會(huì)話。
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
你遇到過下面類似的情況嗎?一個(gè)用戶進(jìn)程長期占用資源而不釋放,導(dǎo)致Oracle進(jìn)程占用了系統(tǒng)的大量資源,Oralce系統(tǒng)的效率變得很低。如果簡(jiǎn)單的關(guān)閉重啟Oracle
實(shí)例,勢(shì)必影響所有的用戶。有沒有辦法僅僅只Kill掉有問題的用戶進(jìn)程而不用關(guān)閉整個(gè)Oralce實(shí)例呢?答案是可以的,使用Oralce提供的一個(gè)名叫Orakill的工具。
大家都知道,Windows
2000是一個(gè)基于線程的操作系統(tǒng),而不是象Unix、Linux那樣基于進(jìn)程的操作系統(tǒng)。整個(gè)Oracle的后臺(tái)進(jìn)程、用戶進(jìn)程等,在Windows
2000環(huán)境下,都包含在ORACLE.EXE這單獨(dú)的一個(gè)體系進(jìn)程中了,通過查看’任務(wù)管理器’――’進(jìn)程’就可以看到。如果你不是使用MTS多線程服
務(wù)器的模式,如果你Kill掉ORACLE.EXE這個(gè)進(jìn)程,將導(dǎo)致整個(gè)Oracle實(shí)例關(guān)閉,如同使用Shutdown
abort命令一樣。
由于Windows自己沒有提過一個(gè)專門用來Kill掉單個(gè)線程的工具,因此Oracle從Oracle7.3.3.6開始,自己提供了一個(gè)基于字符界面的用來在Windows環(huán)境下強(qiáng)制Kill掉一個(gè)線程的工具――Orakill。
在NT中如果使用alter system kill
session
'sid,serial#'來清楚會(huì)話,在執(zhí)行之后該會(huì)話的狀態(tài)會(huì)變?yōu)镵ILLED,但是有時(shí)候這個(gè)狀態(tài)會(huì)保持很長時(shí)間,直到最后被清除。
如果想更快地從內(nèi)存中清理這個(gè)會(huì)話,那么可以在使用了alter
system之后,再在NT中使用Orakill實(shí)用程序(該程序隨Oracle數(shù)據(jù)庫同時(shí)安裝)直接清除該會(huì)話的線程。
Orakill的使用方法如下:
Dos提示符下:orakill sid thread
說明: sid Oracle的Sid號(hào)
thread Oracle的線程id號(hào)
首先取得被殺掉的會(huì)話的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的核心后臺(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
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的實(shí)例號(hào)
即
select instance from v$instance;
而且orakill只能用于oracle實(shí)例安裝在windows上的時(shí)候
用 shutdown immdiate;\x0d\x0a\x0d\x0aSHUTDOWN NORMAL:不允許新的連接、等待會(huì)話結(jié)束、等待事務(wù)結(jié)束、做一個(gè)檢查點(diǎn)并關(guān)閉數(shù)據(jù)文件。啟動(dòng)時(shí)不需要實(shí)例恢復(fù)。\x0d\x0aSHUTDOWN TRANSACTIONAL:不允許新的連接、不等待會(huì)話結(jié)束、等待事務(wù)結(jié)束、做一個(gè)檢查點(diǎn)并關(guān)閉數(shù)據(jù)文件。啟動(dòng)時(shí)不需要實(shí)例恢復(fù)。\x0d\x0aSHUTDOWN IMMEDIATE:不允許新的連接、不等待會(huì)話結(jié)束、不等待事務(wù)結(jié)束、做一個(gè)檢查點(diǎn)并關(guān)閉數(shù)據(jù)文件。沒有結(jié)束的事務(wù)是自動(dòng)rollback的。啟動(dòng)時(shí)不需要實(shí)例恢復(fù)。 \x0d\x0aSHUTDOWN ABORT:不允許新的連接、不等待會(huì)話結(jié)束、不等待事務(wù)結(jié)束、不做檢查點(diǎn)且沒有關(guān)閉數(shù)據(jù)文件。啟動(dòng)時(shí)自動(dòng)進(jìn)行實(shí)例恢復(fù)。
新聞標(biāo)題:如何關(guān)閉oracle會(huì)話,oracle無法終止當(dāng)前會(huì)話
當(dāng)前網(wǎng)址:http://chinadenli.net/article26/dsiisjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、自適應(yīng)網(wǎng)站、虛擬主機(jī)、標(biāo)簽優(yōu)化、企業(yè)建站、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)