Oracle阻塞(blockingblocked)例項詳解
Oracle阻塞(blockingblocked)例項詳解
-----轉載
一、概述:
阻塞是DBA經常碰到的情形,尤其是不良的應用程式設計所造成的阻塞將導致資料庫效能的嚴重下降,直至資料庫崩潰。對DBA而言,有必要知道如何定位到當前系統有哪些阻塞,到底誰是阻塞者,誰是被阻塞者。本文對此給出了描述並做了相關演示。
二、演示阻塞:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
--更新表,注,提示符scott@CNMMBO表明使用者為scott的session,使用者名稱不同,session不同。 scott@CNMMBO>
update
emp set
sal=sal*1.1 where
empno=7788; 1
row updated. scott@CNMMBO>
@my_env SPID
SID SERIAL# USERNAME PROGRAM ------------
---------- ---------- --------------- ------------------------------------------------ 11205
1073 4642 robin oracle@SZDB (TNS V1-V3) --另起兩個session更新同樣的行,這兩個session都會處於等待,直到第一個session提交或回滾 leshami@CNMMBO>
update
scott.emp set
sal=sal+100 where
empno=7788; goex_admin@CNMMBO>
update
scott.emp set
sal=sal-50 where
empno=7788; --下面在第一個session
查詢阻塞情況 scott@CNMMBO>
@blocker BLOCK_MSG
BLOCK --------------------------------------------------
---------- pts/5
( '1073,4642' )
is
blocking 1067,10438 1 pts/5
( '1073,4642' )
is
blocking 1065,4464 1 --上面的結果表明session
1073,4642 阻塞了後面的2個 --即session
1073,4642是阻塞者,後面2個session是被阻塞者 --Author
: Leshami --Blog
:
http://blog.csdn.net/leshami --下面查詢正在阻塞的session
id,SQL語句以及被阻塞的時間 scott@CNMMBO>
@blocking_session_detail.sql 'SID=' ||A.SID|| 'WAITCLASS=' ||A.WAIT_CLASS|| 'TIME=' ||A.SECONDS_IN_WAIT||CHR(10)|| 'QUERY=' ||B.SQL_TEXT ------------------------------------------------------------------------ sid=1067
Wait Class=Application Time =5995 Query= update
scott.emp set
sal=sal+100 where
empno=7788 sid=1065
Wait Class=Application Time =225 Query= update
scott.emp set
sal=sal-50 where
empno=7788 --下面的查詢阻塞時鎖的持有情況
scott@CNMMBO>
@request_lock_type USERNAME
SID TY LMODE REQUEST ID1 ID2 ------------------------------
---------- -- ----------- ----------- ---------- ---------- SCOTT
1073 TX Exclusive None 524319 27412 LESHAMI
1067 TX None Exclusive 524319 27412 GOEX_ADMIN
1065 TX None Exclusive 524319 27412 --可以看到LESHAMI,GOEX_ADMIN
2個使用者都在請求524319/27412上的Exclusive鎖,而此時已經被SCOTT加了Exclusive鎖 --查詢阻塞時鎖的持有詳細資訊 scott@CNMMBO>
@request_lock_detail SID
USERNAME OSUSER TERMINAL OBJECT_NAME TY Lock Mode Req_Mode ----------
-------------------- --------------- ------------------------- -------------------- -- ----------- -------------------- 1065
GOEX_ADMIN robin pts/1 EMP TM Row Excl 1065
GOEX_ADMIN robin pts/1 Trans-524319 TX --Waiting--
Exclusive 1067
LESHAMI robin pts/0 EMP TM Row Excl 1067
LESHAMI robin pts/0 Trans-524319 TX --Waiting--
Exclusive 1073
SCOTT robin pts/5 EMP TM Row Excl 1073
SCOTT robin pts/5 Trans-524319 TX Exclusive |
三、文中涉及到的相關SQL指令碼完整程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
robin@SZDB:~/dba_scripts/custom/sql>
more my_env.sql SELECT
spid, s.sid, s.serial#, p.username, p.program FROM
v$process p, v$session s WHERE
p.addr = s.paddr AND
s.sid = ( SELECT
sid FROM
v$mystat WHERE
rownum = 1); robin@SZDB:~/dba_scripts/custom/sql>
more blocker.sql col
block_msg format a50; select
c.terminal|| '
(' '' ||a.sid|| ',' ||c.serial#|| '' ')
is blocking ' ||b.sid|| ',' ||d.serial#
block_msg, a.block from
v$lock a,v$lock b,v$session c,v$session d where
a.id1=b.id1 and
a.id2=b.id2 and
a.block>0 and
a.sid <>b.sid and
a.sid=c.sid and
b.sid=d.SID; robin@SZDB:~/dba_scripts/custom/sql>
more blocking_session_detail.sql --To
find the query for blocking session --Access
Privileges: SELECT on v$session, v$sqlarea SELECT
'sid=' ||
a.SID ||
'
Wait Class=' ||
a.wait_class ||
'
Time=' ||
a.seconds_in_wait ||
CHR (10) ||
'
Query=' ||
b.sql_text FROM
v$session a, v$sqlarea b WHERE
a.blocking_session IS
NOT
NULL
AND
a.sql_address = b.address ORDER
BY
a.blocking_session / robin@SZDB:~/dba_scripts/custom/sql>
more request_lock_type.sql --This
script generates a report of users waiting for locks. --Access
Privileges: SELECT on v$session, v$lock 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; robin@SZDB:~/dba_scripts/custom/sql>
more request_lock_detail.sql set
linesize 190 col
osuser format a15 col
username format a20 wrap col
object_name format a20 wrap col
terminal format a25 wrap col
Req_Mode format a20 select
B.SID, C.USERNAME, C.OSUSER, C.TERMINAL, DECODE(B.ID2,
0, A.OBJECT_NAME, 'Trans-' ||to_char(B.ID1))
OBJECT_NAME, B.TYPE, DECODE(B.LMODE,0, '--Waiting--' , 1, 'Null' , 2, 'Row
Share' , 3, 'Row
Excl' , 4, 'Share' , 5, 'Sha
Row Exc' , 6, 'Exclusive' , 'Other' )
"Lock
Mode" , DECODE(B.REQUEST,0, '
' , 1, 'Null' , 2, 'Row
Share' , 3, 'Row
Excl' , 4, 'Share' , 5, 'Sha
Row Exc' , 6, 'Exclusive' , 'Other' )
"Req_Mode" from
DBA_OBJECTS A, V$LOCK B, V$SESSION C where
A.OBJECT_ID(+) = B.ID1 and
B.SID = C.SID and
C.USERNAME is
not
null order
by
B.SID, B.ID2; |
相關文章
- Oracle 例項恢復詳解Oracle
- 【函式】oracle translate() 詳解+例項函式Oracle
- Oracle minus用法詳解及應用例項Oracle
- curl例項詳解
- sudo 詳解+例項
- Oracle資料庫AWR的使用例項詳解Oracle資料庫
- 元件例項 $el 詳解元件
- Crontab例項-命令詳解
- tcl/tk例項詳解——glob使用例解
- 模擬阻塞會話例項會話
- 並查集例項詳解並查集
- EventBus詳解及簡單例項單例
- CSS例項詳解:Flex佈局CSSFlex
- PHP生成日曆(例項詳解)PHP
- FTP命令詳解(含操作例項)FTP
- python閉包詳解(例項)Python
- .Net設計模式例項詳解設計模式
- linux中sleep詳解例項Linux
- 【02】Oracle資料庫的例項啟動關閉詳解Oracle資料庫
- PHP7 新增功能詳解(例項)PHP
- Spring事務管理(詳解+例項)Spring
- 50個典型電路例項詳解
- 閉包用法結合例項詳解
- tcl/tk例項詳解——catch和errorError
- MySQL共享鎖:使用與例項詳解MySql
- oracle 修改ORACLE例項Oracle
- 2 Day DBA-管理Oracle例項-Oracle例項和例項管理概覽Oracle
- 正規表示式分組例項詳解
- 例項詳解貝葉斯推理的原理
- curl庫pycurl例項及引數詳解
- rman catalog的配置及詳解例項
- PHP類和物件函式例項詳解PHP物件函式
- crontab定期執行命令詳解,以及例項
- python爬蟲框架scrapy例項詳解Python爬蟲框架
- RMAN例項備份與恢復詳解
- 管理ORACLE例項Oracle
- Python程式和執行緒例項詳解Python執行緒
- 例項詳解 Java 死鎖與破解死鎖Java