有時,Oracle中造成一些表被死鎖或者會話異常退出,如執(zhí)行了更新記錄操作后,既沒有commit也沒有rollback,網(wǎng)絡(luò)就斷開了,也會造表或記錄被鎖住,待到超時后才會被解開,那樣都會造成應(yīng)用操作被阻塞。
為千山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及千山網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、千山網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
可以以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
你遇到過下面類似的情況嗎?一個用戶進(jìn)程長期占用資源而不釋放,導(dǎo)致Oracle進(jìn)程占用了系統(tǒng)的大量資源,Oralce系統(tǒng)的效率變得很低。如果簡單的關(guān)閉重啟Oracle
實例,勢必影響所有的用戶。有沒有辦法僅僅只Kill掉有問題的用戶進(jìn)程而不用關(guān)閉整個Oralce實例呢?答案是可以的,使用Oralce提供的一個名叫Orakill的工具。
大家都知道,Windows
2000是一個基于線程的操作系統(tǒng),而不是象Unix、Linux那樣基于進(jìn)程的操作系統(tǒng)。整個Oracle的后臺進(jìn)程、用戶進(jìn)程等,在Windows
2000環(huán)境下,都包含在ORACLE.EXE這單獨的一個體系進(jìn)程中了,通過查看’任務(wù)管理器’――’進(jìn)程’就可以看到。如果你不是使用MTS多線程服
務(wù)器的模式,如果你Kill掉ORACLE.EXE這個進(jìn)程,將導(dǎo)致整個Oracle實例關(guān)閉,如同使用Shutdown
abort命令一樣。
由于Windows自己沒有提過一個專門用來Kill掉單個線程的工具,因此Oracle從Oracle7.3.3.6開始,自己提供了一個基于字符界面的用來在Windows環(huán)境下強(qiáng)制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上的時候
從Oracle10g開始,Oracle極大的增強(qiáng)了OEM工具,并通過服務(wù)器端進(jìn)行EM工具全面展現(xiàn)。
在10g中,客戶端可以不必安裝任何Oracle客戶端工具,僅憑瀏覽器就可以調(diào)用強(qiáng)大的EM工具。
在Server端,可以通過如下命令啟動EM工具控制臺:
emctl start dbconsole
以下是啟動過程:
[oracle@danaly ~]$ emctl start dbconsole
TZ set to PRC
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
Starting Oracle Enterprise Manager 10g Database Control .......................... started.
------------------------------------------------------------------
Logs are generated in directory /opt/oracle/product/10.2.0/.cn_danaly/sysman/log
啟動之后我們就可以通過在瀏覽器端輸入以下url訪問:
同樣停止OEM可以輸入如下命令:
emctl stop dbconsole
以下是停止過程:
[oracle@danaly ~]$ emctl stop dbconsole
TZ set to PRC
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
Stopping Oracle Enterprise Manager 10g Database Control ...... Stopped.
也可以直接鍵入emctl查看emctl支持的選項:
[oracle@danaly ~]$ emctl
TZ set to PRC
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
Invalid arguments
Unknown command option
Usage::
Oracle Enterprise Manager 10g Database Control commands:
emctl start| stop| status| setpasswd dbconsole
emctl secure
emctl set ssl test|off|on em
emctl set ldap
emctl blackout options can be listed by typing "emctl blackout"
emctl config options can be listed by typing "emctl config"
emctl secure options can be listed by typing "emctl secure"
emctl ilint options can be listed by typing "emctl ilint"
emctl deploy options can be listed by typing "emctl deploy"
方法/步驟\x0d\x0a1.查詢哪些對象被鎖:\x0d\x0aselect object_name,machine,s.sid,s.serial# \x0d\x0afrom v$locked_object l,dba_objects o ,v$session s\x0d\x0awhere l.object_id = o.object_id and l.session_id=s.sid;\x0d\x0a\x0d\x0a2.殺死進(jìn)程:\x0d\x0aalter system kill session '137,233'; (其中137,223分別是上面查詢出的sid,serial#)\x0d\x0a\x0d\x0aPS.以上兩步,可通過Oracle的管理控制臺來執(zhí)行。\x0d\x0a\x0d\x0a如果利用上面的方法殺死進(jìn)程后,進(jìn)程狀態(tài)雖被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在OS一級再殺死相應(yīng)的進(jìn)程(線程)\x0d\x0a\x0d\x0a1.首先獲得進(jìn)程(線程)號:\x0d\x0aselect spid, osuser, s.program \x0d\x0afrom v$session s,v$process p\x0d\x0awhere s.paddr=p.addr and s.sid=137 (137是上面的sid)\x0d\x0a\x0d\x0a2.在OS上殺死這個進(jìn)程(線程):\x0d\x0a\x0d\x0a1)在unix上,用root身份執(zhí)行命令: \x0d\x0a#kill -9 12345(即上面查詢出的spid)\x0d\x0a\x0d\x0a2)在windows(unix也適用)用orakill殺死線程,例:c:orakill orcl 12345\x0d\x0aorakill是oracle提供的一個可執(zhí)行命令,語法為:orakill sid thread\x0d\x0a其中:\x0d\x0asid:表示要殺死的進(jìn)程屬于的實例名\x0d\x0athread:是要殺掉的線程號,即上面查詢出的spid。
分享標(biāo)題:oracle怎么清線程,清理oracle
本文網(wǎng)址:http://aaarwkj.com/article4/dssjhie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、域名注冊、定制網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)站制作、企業(yè)網(wǎng)站制作
聲明:本網(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)