Oracle-監控使用者鎖

Michael_DD發表於2014-12-02
Oracle-監控使用者鎖


資料庫的鎖有時候是比較耗費資源的, 特別是發生鎖等待的時候, 我們必須找到發生等待的鎖, 有可能的話, 殺掉該程式. 下面的語句將找到資料庫中所有的DML語句產生的鎖,
還可以發現, 任何DML語句其實產生了兩個鎖, 一個是表鎖, 一個是行鎖. 可以透過alter system kill session ‘sid, serial#’來殺掉會話.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT /*+ rule */
 s.username,
 decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
 o.owner,
 o.object_name,
 o.object_type,
 s.sid,
 s.serial#,
 s.terminal,
 s.machine,
 s.program,
 s.osuser
  FROM v$session s, v$lock l, dba_objects o
 WHERE l.sid = s.sid
   AND l.id1 = o.object_id(+)
   AND s.username is NOT NULL;


我們要關注TX和TM兩種型別的鎖, UL鎖為使用者自定義鎖, 一般很少會定義, 基本不用關注, 其他均為系統鎖, 會很快自動釋放, 不用關注.
ID1    NUMBER    Lock identifier #1 (depends on type)

ID2    NUMBER    Lock identifier #2 (depends on type)
當lock_type為TM時, Id1為DMLlocked object的object id . 當lock type 為TX時, id1為usn+slot, id2為seq. 當lock_type為其它時, 不用關注.

LMODE    NUMBER    Lock mode in which the session holds the lock:
?    0 - none
?    1 - null (NULL)
?    2 - row-S (SS)
?    3 - row-X (SX)
?    4 - share (S)
?    5 - S/Row-X (SSX)
?    6 - exclusive (X)
大於0時表示當前會話正以某種模式佔有該鎖, 等於0時表示當前會話正在等待該鎖資源, 即表示該會話被阻塞.
往往在發生TX鎖時, 伴隨TM鎖, 比如一個sid=9會話擁有一個TM鎖, 一般會擁有一個或幾個TX鎖, 但他們的id1和id2是不同的.
REQUEST    NUMBER    Lock mode in which the process requests the lock:
?    0 - none
?    1 - null (NULL)
?    2 - row-S (SS)
?    3 - row-X (SX)
?    4 - share (S)
?    5 - S/Row-X (SSX)
?    6 - exclusive (X)
大於0時表示會話被阻塞
CTIME    NUMBER    Time since current mode was granted
BLOCK    NUMBER    The lock is blocking another lock
該鎖是否阻塞了其他的會話.
0: not blocking /*沒有阻塞其他會話*/
1: blocking /*阻塞了其他會話*/
2: global /*未知情況*/


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SQL> select * from v$lock;

ADDR             KADDR                   SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
000000008FD8EDD8 000000008FD8EE30          5 RS           25          1          2          0     686887          2
000000008FD8DFC0 000000008FD8E018          5 XR            4          0          1          0     686894          2
000000008FD8DE00 000000008FD8DE58          5 RD            1          0          1          0     686894          2
000000008FD8E420 000000008FD8E478          5 CF            0          0          2          0     686891          2
000000008FD8FF70 000000008FD8FFC8         14 AE          100          0          4          0      79464          2
000000008FD8FB10 000000008FD8FB68         15 AE          100          0          4          0      81776          2
000000008CF32B18 000000008CF32B90         15 TX       589834       1078          6          0      77397          2
00002B25BA245BF8 00002B25BA245C58         15 TM        87546          0          3          0      79085          2
000000008FD8DEE0 000000008FD8DF38         64 XR            0          0          1          0     686894          2
000000008FD8E0A0 000000008FD8E0F8         69 TS            3          1          3          0     686884          2
000000008FD8E180 000000008FD8E1D8         70 AE          100          0          4          0     686878          2
000000008FD8E260 000000008FD8E2B8         70 CO            0          0          6          0     686883          2
000000008FD8F5B8 000000008FD8F610        130 DM            1          0          4          0     686885          2
000000008FD8E6C0 000000008FD8E718        130 MR            1          8          4          0     686887          2
000000008FD8E7A0 000000008FD8E7F8        130 MR            2          8          4          0     686887          2
000000008FD8E880 000000008FD8E8D8        130 MR            3          8          4          0     686887          2
000000008FD8E960 000000008FD8E9B8        130 MR            4          8          4          0     686887          2
000000008FD8EA40 000000008FD8EA98        130 MR            5          8          4          0     686887          2
000000008FD8EB20 000000008FD8EB78        130 MR          201          8          4          0     686887          2
000000008FD8EC18 000000008FD8EC70        130 MR            3          0          4          0     686886          2
000000008FD8F238 000000008FD8F290        130 MR            4          0          4          0     686886          2
000000008FD8F3F8 000000008FD8F450        130 MR            5          0          4          0     686886          2
000000008FD8F158 000000008FD8F1B0        130 MR            1          0          4          0     686886          2
000000008FD8EEB8 000000008FD8EF10        130 MR            2          0          4          0     686886          2
000000008FD8F4D8 000000008FD8F530        130 MR          201          0          4          0     686886          2
000000008FD8EF98 000000008FD8EFF0        130 RT            1          2          6          0     686886          2
000000008FD90590 000000008FD905E8        134 AE          100          0          4          0      75571          2
000000008FD8F698 000000008FD8F6F0        140 AE          100          0          4          0     686870          2
000000008FD903D0 000000008FD90428        143 AE          100          0          4          0      81027          2
000000008FD8ECF8 000000008FD8ED50        188 KD            0          0          6          0     686883          2
000000008FD8E500 000000008FD8E558        188 KT        12876          0          4          0      34635          2
000000008FD8E5E0 000000008FD8E638        191 RT            1          0          6          0     686887          2
000000008FD8F078 000000008FD8F0D0        191 RT            1          1          6          0     686886          2
000000008FD8FDB0 000000008FD8FE08        199 AE          100          0          4          0     686870          2

34 rows selected.

SQL>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1 oracle鎖概念基礎
資料庫是一個多使用者使用的共享資源. 當多個使用者併發地存取資料時, 在資料庫中就會產生多個事務同時存取同一資料的情況. 若對併發操作不加控制就可能會讀取和儲存不正確的資料, 破壞資料的一致性.
加鎖是實現資料庫併發控制的一個非常重要的技術. 當事務在對某個資料物件進行操作前, 先向系統發出請求, 對其加鎖. 加鎖後事務就對該資料物件有了一定的控制, 在該事務釋放鎖之前, 其他的事務不能對此資料物件進行更新操作.
3.1.1 oracle資料庫的鎖型別
根據保護的物件不同, oracle資料庫鎖可以分為以下幾個大類:
?    DML鎖(data locks 資料鎖), 使用者保護資料的完整性;
?    DDL鎖(dictionary locks, 字典鎖)用於保護資料庫物件的結構, 如表, 索引等的結構定義;
?    內部鎖和閂(internal locks and latches), 保護資料庫的內部結構.
DML鎖的目的在於保證併發情況下的資料完整性. 在oracle資料庫中, DML鎖主要包括TM鎖和TX鎖, 其中TM鎖稱為表級鎖, TX鎖稱為事務鎖或行鎖.
當oracle執行DML語句時, 系統自動在所要操作的表上申請TM型別的鎖. 當TM鎖獲得後, 系統再自動申請TX型別的鎖, 並將實際鎖定的資料行的鎖標誌位進行置位. 這樣在事務鎖加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌, 而只需要檢查TM鎖模式的相容性即可, 從而大大提供了系統的效率. TM鎖包括了SS, SX, S, X等多種模式, 在資料庫中用0-6來表示, 不同的SQL操作產生不同型別的TM鎖.
在資料行上只有X鎖(排他鎖). 在oracle中, 當一個事務首先發起一個DML語句時就獲得一個TX鎖, 該鎖保持到事務被提交或回滾. 當兩個或多個會話在表的同一條記錄上執行DML語句時, 第一個會話在該條記錄上加鎖, 其他的會話處於等待狀態. 當第一個會話提交後, TX鎖被釋放, 其他會話才可以加鎖.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 oracle的TX級鎖
許多對oracle不太瞭解的技術人員可能會以為每一個TX鎖代表一條封鎖的資料行, 其實不然, TX的本意是transaction(事務), 當一個事務第一次執行資料更改時, 它即獲得一個TX鎖, 直到事務結束, 該鎖才會被釋放.
在oracle的每行資料上, 都有一個標誌位來表示該行資料是否被鎖定. 資料行上的鎖標誌一旦被置位, 就表明該行資料被加X鎖, oracle在資料行上沒有S鎖.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 oracle的TM鎖
表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的資料很多,逐行檢查鎖標誌的開銷將很大,系統的效能將會受到影響。為了解決這個問題,可以在表級引入新的鎖型別來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。
意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對錶加鎖時,就不再需要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提高。

3.1 意向鎖的型別
由兩種基本的鎖型別(S鎖、X鎖),可以自然地派生出兩種意向鎖:
意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個資料庫物件加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖;
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個資料庫物件加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。
另外,基本的鎖型別(S、X)與意向鎖型別(IS、IX)之間還可以組合出新的鎖型別,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這裡的“=”指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。
這樣我們又可以引入一種新的鎖的型別
共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖):如果對一個資料庫物件加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX.例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。
這樣資料庫物件上所加的鎖型別就可能有5種:即S、X、IS、IX、SIX.
具有意向鎖的多粒度封鎖方法中任意事務T要對一個資料庫物件加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷。

3.2 oracle的TM鎖
Oracle的DML鎖(資料鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)型別共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應。需要注意的是,由於Oracle在行級只提供X鎖,所以與RS鎖(透過SELECT … FOR UPDATE語句獲得)對應的行級鎖也是X鎖(但是該行資料實際上還沒有被修改),這與理論上的IS鎖是有區別的。
下表為Oracle資料庫TM鎖的相容矩陣(Y=Yes,表示相容的請求;N=No,表示不相容的請求;-表示沒有加鎖請求):
T2
T1    S    X    RS    RX    SRX    -
S    Y    N    Y    N    N    Y
X    N    N    N    N    N    Y
RS    Y    N    Y    Y    Y    Y
RX    N    N    Y    Y    N    Y
SRX    N    N    Y    N    N    Y
-    Y    Y    Y    Y    Y    Y



+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 監控被鎖定的物件

select rpad(oracle_username, 10) o_name,
       session_id sid,       
       decode(locked_mode,
              0,
              'None',
              1,
              'Null',
              2,
              'Row share',              
              3,
              'Row Exclusive',
              4,
              'Share',
              5,
              'Share Row Exclusive',
              6,
              'Exclusive') lock_type,       
       object_name,
       xidusn,
       xidslot,
       xidsqn
  from v$locked_object, all_objects
 where v$locked_object.object_id = all_objects.object_id;


This view lists all locks acquired by every transaction on the system.
Column    Datatype    Description
XIDUSN    NUMBER    Undo segment number 回滾段號
XIDSLOT    NUMBER    Slot number 槽號
XIDSQN    NUMBER    Sequence number 序列號
OBJECT_ID    NUMBER    Object ID being locked 被鎖物件標識
SESSION_ID    NUMBER    Session ID持有鎖的會話
ORACLE_USERNAME    VARCHAR2(30)    Oracle user name持有該鎖的使用者的oracle使用者名稱
OS_USER_NAME    VARCHAR2(15)    OS user name持有該鎖的使用者的作業系統使用者
PROCESS    VARCHAR2(9)    OS process ID作業系統程式號
LOCKED_MODE    NUMBER    Lock mode 鎖模式


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 跟使用者鎖相關的其他動態效能檢視

1.查詢資料庫中的鎖

select * from v$lock;
select * from v$lock where block=1;

2.查詢被鎖的物件

select * from v$locked_object;

3.查詢阻塞

查被阻塞的會話
select * from v$lock where lmode=0 and  type in ('TM','TX');

查阻塞別的會話鎖
select * from v$lock where lmode>0 and  type in ('TM','TX');

4.查詢資料庫正在等待鎖的程式

select * from v$session where lockwait is not null;

5.查詢會話之間鎖等待的關係
select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;
6.查詢鎖等待事件
select * from v$session_wait where event='enqueue';

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

相關文章