在數據庫運維工做中,有至關大一部分工做跟鎖有關。sql
鎖用對了地方能保證數據一致性,用錯了地方就能致使併發性降低。數據庫
下面來說解數據庫發生鎖,該如何進行診斷:session
首先將幾個鎖相關的視圖:併發
v$lock運維
v$lock_objectui
v$sessioncode
dba_objects對象
v$processes事件
v$sql事務
一、v$lock
type:TM 表鎖 或者DML鎖
TX 行鎖 事務鎖
lmode:會話保持的鎖模式
0 = none
1 = null
2 = Row-S(SS 行級共享鎖 ,只能查詢這些對象)
3 = Row-X(行級排他鎖,在提交前不容許修改)
4 = Share(共享鎖)
5 = S/ROW-X(共享行級排他鎖)
6 = Exclusive(排他鎖)
ID1,ID2 根據Type取值不一樣而不一樣。
對於type=TM表級鎖或者DML鎖, ID1表示被鎖定表的object_id,ID2 爲0 ;
對於type=TX事務鎖,ID1表示高事務所佔用的回滾段及事務槽,ID2表示爲 環繞warp次數,即事務槽被重用的次數
REQUEST:表示會話請求鎖類型
block:表示堵塞了別的會話對該鎖對象的請求次數,重點關注大於 1 ,等待鎖類型由lmode決定,
SQL> select addr,kaddr,sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM'); ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST BLOCK ---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- 000007FF5EC570F0 000007FF5EC57148 8 TX 589848 1189 0 6 0 000000001FCCDA30 000000001FCCDA90 8 TM 74686 0 3 0 0 000000001FCCDA30 000000001FCCDA90 73 TM 74686 0 3 0 0 000007FF5ACD8880 000007FF5ACD88F8 73 TX 589848 1189 6 0 1
73 會話持有TX鎖,鎖類型類6(排他鎖),堵塞別人1次;
8 會話持有TX鎖,鎖類型爲0,請求6號鎖,;
從ID1,ID2可知 這兩個事務請求的對象都同樣,可見 73堵塞了8。
到底鎖發生的對象是哪一個?能夠查看
能夠看到一點,lmode = 0 表示會話沒有持有鎖,可是 頗有可能被別的會話給堵塞了,具體要REQUEST 字段和ID1,ID2字段
死鎖查詢:
select a.sid,holdsid,b.sid,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.bllck =0;
查詢TM表鎖對象:
select object_name from dba_objects o ,v$lock l where l.ID1=o.object_id and l.TYPE='TM';
查詢TX鎖對象:
select ss.EVENT,ss.SID,ss.SERIAL#,ss.PADDR,ss.ROW_WAIT_OBJ#,obj.object_name from v$session ss ,
dba_objects obj,v$lock l where ss.ROW_WAIT_OBJ#=obj.object_id and ss.SID=l.SID and l.KADDR=ss.LOCKWAIT;
SQL> select ss.EVENT,ss.SID,ss.SERIAL#,ss.PADDR,ss.ROW_WAIT_OBJ#,obj.object_name from v$session ss , 2 dba_objects obj,v$lock l where ss.ROW_WAIT_OBJ#=obj.object_id and ss.SID=l.SID and l.KADDR=ss.LOCKWAIT 3 ; EVENT SID SERIAL# PADDR ROW_WAIT_OBJ# OBJECT_NAME -------------------------------- ------- ---------- ---------------- ------------- --------------- enq: TX - row lock contention 8 36 000007FF5E4D9DE0 74686 TEST1
或者
SQL> select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL" 2 from v$session a, v$lock b, v$sqltext c 3 where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value 4 ; USERNAME MACHINE SID SERIAL# Seconds ID1 SQL -------- ----------------------------- ------- ---------- ---------- ---------- ---------------------------------------------------------------- SYS WORKGROUP\PC201812010809 8 36 10863 589848 update test1 set object_id=object_id+1 where object_id=1900
不知道你們有沒有感受得在數據庫經過‘ alter system kill session 'sid,serial#' immediate;'’殺會話,有時候殺不掉,這個時候咱們能夠經過OS系統 pid 來殺 pkill -9 SID
SQL> select a.spid,a.PID,a.username,b.program,b.SID,b.SERIAL# from v$process a,v$session b,v$lock c where a.addr=b.paddr and c.SID=b.SID and c.TYPE in ('TX','TM'); SPID PID USERNAME PROGRAM SID SERIAL# ------- ---------- --------------- -------------------------- 8964 20 SYSTEM sqlplus.exe 8 36 8964 20 SYSTEM sqlplus.exe 8 36 10368 49 SYSTEM sqlplus.exe 73 2616 10368 49 SYSTEM sqlplus.exe 73 2616
下面來探討一下,誰堵塞了誰?
這個須要查看v$lock 視圖,block表示堵塞別人次數,只要block>1就比是堵塞了別人,有死鎖。
REQUEST 表示這個SID請求鎖類型,LMODE表示SID持有鎖類型,對於排他鎖而言,一旦持有排它鎖,那麼就堵塞了別人的會話,。
二、 v$locked_object
This view lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.
只包含DML的鎖信息,包括回滾段和會話的信息。因此v$lock_object查詢庫鎖使用狀況,有鎖不必定表明是死鎖,這個必定要記住。
持有鎖對象查詢(不必定是死鎖):
select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id = t2.sid order by logon_time
總結:
其它相關視圖說明
視圖名 描述 主要字段說明
v$session 查詢會話的信息和鎖的信息。
sid,serial#:表示會話信息。
program:表示會話的應用程序信息。
row_wait_obj#:表示等待的對象,和dba_objects中的object_id相對應。
lockwait :該會話等待的鎖的地址,與v$lock的kaddr對應.
v$session_wait 查詢等待的會話信息。 sid:表示持有鎖的會話信息。
Seconds_in_wait:表示等待持續的時間信息
Event:表示會話等待的事件,鎖等於enqueue
dba_locks 對v$lock的格式化視圖。
Session_id:和v$lock中的Sid對應。
Lock_type:和v$lock中的type對應。
Lock_ID1: 和v$lock中的ID1對應。
Mode_held,mode_requested:和v$lock中的lmode,request相對應。
v$locked_object 只包含DML的鎖信息,包括回滾段和會話信息。
Xidusn,xidslot,xidsqn:表示回滾段信息。和v$transaction相關聯。
Object_id:表示被鎖對象標識。
Session_id:表示持有鎖的會話信息。
Locked_mode:表示會話等待的鎖模式的信息,和v$lock中的lmode一致。