oracle鎖的管理(轉)

Rounders發表於2007-08-06

oracle鎖的管理。

[@more@]

鎖的種類:
資料鎖DML,字典鎖DDL,表鎖TM,事務鎖TX,人工鎖定

DML鎖的模式
1:空
2:行共享(RS):行共享是一個共享表鎖,它用於專用鎖。
3:行專用(RX):用於行的修改
4:共享鎖(S):阻止其他DML操作
5:共享行專用(SRX):阻止其他事務操作
6:專用(X):獨立訪問使用

V$LOCK
欄位內容:SID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK
TYPE:TX(TM,DML,表鎖),MR介質恢復,ST磁碟空間管理
LMODE/REQUEST:01:空, 2:RS, 3:RX 4:S 5:SRX 6:X
LMODE:0,1表明程式已經獲得一個鎖,非0,等待獲得一個瑣
ID1:TX狀態下,等待鎖的物件ID,TM狀態下,回滾號碼的十進位制
ID2:TM:0 TX:回滾槽重新使用的次數


V$session_wait
列舉了活動會話正在等待的事件,其中P2TEXT,P3TEXT能從V$LOCK中取得

V$SYSSTAT
包含對整個系統的所有重要的統計資訊,可以使用v$sysstat對每一個會話等待鎖定的次數進行統計

有用的SQL:

1:檢查系統中鎖的簡單指令碼:
Select s.username, s.sid, l.type, l.id1, l.id2, l.lmode, l.request, p.spid PID
From v$lock l, v$session s, v$process p
Where s.sid = l.sid And p.addr = s.paddr And s.username is not null
Order By id1, s.sid,request;
獲取使用者SID,PID,鎖的種類,鎖的型別等資訊

2:獲取資料庫鎖的資訊(使用者ID,OBJECT,SQL)

REM *****************************************************************
REM TITLE : Generic Script which displays SQL Text, REM SID
and Object name of the locks currently REM being held in the database.
REM MODULE : lock_held.sql
Set pagesize 60
Set linesize 132
select s.username username, a.sid sid, a.owner||'.'||a.object object, s.lockwait, t.sql_text SQL
from v$sqltext t, v$session s, v$access a
where t.address = s.sql_address and t.hash_value = s.sql_hash_value
and s.sid = a.sid and a.owner != 'SYS'
and upper(substr(a.object,1,2)) != 'V$' ;
REM REM End of "Lock Monitoring Script" REM

3:產生等待鎖的使用者報告
SELECT sn.username,m.sid, m.type, DECODE(m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share',
3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode,
ltrim(to_char(lmode,'990'))) lmode,
DECODE(m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share',
5, 'S/Row Excl.', 6, 'Exclusive', request, ltrim(to_char(m.request,'990'))) request,
m.id1, m.id2
FROM v$session sn, v$lock m |
WHERE (sn.sid = m.sid AND m.request != 0)
OR ( sn.sid = m.sid AND m.request = 0 AND lmode != 4 AND (id1, id2) IN (SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2) )
ORDER BY id1, id2, m.request;


4:顯示持有鎖的資訊:
select nvl(S.USERNAME,'Internal') username, nvl(S.TERMINAL,'None') terminal, L.SID||','||S.SERIAL# Kill,
U1.NAME||'.'||substr(T1.NAME,1,20) tab,
decode(L.LMODE, 1,'No Lock', 2,'Row Share', 3,'Row Exclusive', 4,'Share',
5,'Share Row Exclusive', 6,'Exclusive',null) lmode,
decode(L.REQUEST,1,'No Lock', 2,'Row Share', 3,'Row Exclusive', 4,'Share',
5,'Share Row Exclusive', 6,'Exclusive',null) request
from V$LOCK L, V$SESSION S, SYS.USER$ U1, SYS.OBJ$ T1
where L.SID = S.SID and T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2) and U1.USER# = T1.OWNER# and S.TYPE != 'BACKGROUND'
order by 1,2,5

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9417382/viewspace-932288/,如需轉載,請註明出處,否則將追究法律責任。

相關文章