有時(shí),Oracle中造成一些表被死鎖或者會(huì)話異常退出,如執(zhí)行了更新記錄操作后,既沒(méi)有commit也沒(méi)有rollback,網(wǎng)絡(luò)就斷開(kāi)了,也會(huì)造表或記錄被鎖住,待到超時(shí)后才會(huì)被解開(kāi),那樣都會(huì)造成應(yīng)用操作被阻塞。
為千山等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及千山網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、千山網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
可以以O(shè)ralce管理員權(quán)限用戶登錄Oracle數(shù)據(jù),查詢到被鎖的對(duì)象,然后殺除指定的會(huì)話。
用下面的語(yǔ)句查詢被鎖的對(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語(yǔ)句語(yǔ)法如下:
alter system kill session 'sid, serial#'
如上面查出來(lái)的一條記錄的sid是53, serial#為663,就執(zhí)行以下的語(yǔ)句 alter system kill session '53,663'
如果要一次性殺死多個(gè)會(huì)話,一個(gè)一個(gè)填寫(xiě)sid和serial#十分的繁瑣,應(yīng)該在查詢被鎖對(duì)象的同時(shí)拼湊出多條的殺會(huì)話語(yǔ)句,以分號(hào)分隔,一起復(fù)制下來(lái),然后就可以批量的執(zhí)行了。
拼湊kill語(yǔ)句的方式如下,下面加了一個(gè)過(guò)濾條件和一個(gè)排序,殺除真正關(guān)心的表,并且著重注意超時(shí)時(shí)間過(guò)長(zhǎng)的會(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
你遇到過(guò)下面類似的情況嗎?一個(gè)用戶進(jìn)程長(zhǎng)期占用資源而不釋放,導(dǎo)致Oracle進(jìn)程占用了系統(tǒng)的大量資源,Oralce系統(tǒng)的效率變得很低。如果簡(jiǎn)單的關(guān)閉重啟Oracle
實(shí)例,勢(shì)必影響所有的用戶。有沒(méi)有辦法僅僅只Kill掉有問(wèn)題的用戶進(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)程中了,通過(guò)查看’任務(wù)管理器’――’進(jìn)程’就可以看到。如果你不是使用MTS多線程服
務(wù)器的模式,如果你Kill掉ORACLE.EXE這個(gè)進(jìn)程,將導(dǎo)致整個(gè)Oracle實(shí)例關(guān)閉,如同使用Shutdown
abort命令一樣。
由于Windows自己沒(méi)有提過(guò)一個(gè)專門用來(lái)Kill掉單個(gè)線程的工具,因此Oracle從Oracle7.3.3.6開(kāi)始,自己提供了一個(gè)基于字符界面的用來(lái)在Windows環(huán)境下強(qiáng)制Kill掉一個(gè)線程的工具――Orakill。
在NT中如果使用alter system kill
session
'sid,serial#'來(lái)清楚會(huì)話,在執(zhí)行之后該會(huì)話的狀態(tài)會(huì)變?yōu)镵ILLED,但是有時(shí)候這個(gè)狀態(tài)會(huì)保持很長(zhǎng)時(shí)間,直到最后被清除。
如果想更快地從內(nèi)存中清理這個(gè)會(huì)話,那么可以在使用了alter
system之后,再在NT中使用Orakill實(shí)用程序(該程序隨Oracle數(shù)據(jù)庫(kù)同時(shí)安裝)直接清除該會(huì)話的線程。
Orakill的使用方法如下:
Dos提示符下:orakill sid thread
說(shuō)明: 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í)候
從Oracle10g開(kāi)始,Oracle極大的增強(qiáng)了OEM工具,并通過(guò)服務(wù)器端進(jìn)行EM工具全面展現(xiàn)。
在10g中,客戶端可以不必安裝任何Oracle客戶端工具,僅憑瀏覽器就可以調(diào)用強(qiáng)大的EM工具。
在Server端,可以通過(guò)如下命令啟動(dòng)EM工具控制臺(tái):
emctl start dbconsole
以下是啟動(dòng)過(guò)程:
[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
啟動(dòng)之后我們就可以通過(guò)在瀏覽器端輸入以下url訪問(wèn):
同樣停止OEM可以輸入如下命令:
emctl stop dbconsole
以下是停止過(guò)程:
[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支持的選項(xiàng):
[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.查詢哪些對(duì)象被鎖:\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.以上兩步,可通過(guò)Oracle的管理控制臺(tái)來(lái)執(zhí)行。\x0d\x0a\x0d\x0a如果利用上面的方法殺死進(jìn)程后,進(jìn)程狀態(tài)雖被置為"killed",但是鎖定的資源很長(zhǎng)時(shí)間沒(méi)有被釋放,那么可以在OS一級(jí)再殺死相應(yīng)的進(jìn)程(線程)\x0d\x0a\x0d\x0a1.首先獲得進(jìn)程(線程)號(hào):\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上殺死這個(gè)進(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提供的一個(gè)可執(zhí)行命令,語(yǔ)法為:orakill sid thread\x0d\x0a其中:\x0d\x0asid:表示要?dú)⑺赖倪M(jìn)程屬于的實(shí)例名\x0d\x0athread:是要?dú)⒌舻木€程號(hào),即上面查詢出的spid。