1. Recived alert:
DBNAME:critical-Higher wait events:enq: TX - row lock contention-63(threshold 50)
2. Checking the wait events, find that the count for 'enq: TX - row lock contention' is high
COUNT(*) EVENT MAX(SECONDS_IN_WAIT)
---------- --------------------------------------------- --------------------
5753 SQL*Net message from client 6048278
188 SQL*Net break/reset to client 33425
149 enq: TX - row lock contention 12274
20 rdbms ipc message 41691
1 Streams AQ: qmn slave idle wait 556815
1 Streams AQ: waiting for messages in the queue 5
1 Streams AQ: waiting for time management or cl 33106
eanup tasks
1 db file parallel write 0
1 direct path write 2
1 Streams AQ: qmn coordinator idle wait 6184833
1 jobq slave wait 18
1 os thread startup 0
1 pmon timer 18795
1 smon timer 5504
1 SQL*Net message to client 0
3. Checking locks:
Looks everyone is waiting for sid=7752
system@DBNAME> @qlocks
Lock Time Held
SID Lock Type Requested Lock Held (minutes) Block
------ --------- --------- --------- --------- -----
7752 Trans None Exclusive 325 Yes
3994 Trans Share None 324 No
8305 Trans Share None 323 No
4922 Trans Share None 292 No
3977 Trans Share None 285 No
7668 Trans Share None 282 No
4379 Trans Share None 124 No
5423 Trans Share None 1 No
7611 Trans Share None 1 No
6080 Trans Share None 1 No
3843 Trans Share None 0 No
4731 Trans Share None 0 No
( truncated ... total 116 rows )
system@DBNAME> @blocker
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME Block
---------------- ---------------- ------ -- ---------- ---------- ---------- ---------- ---------- ----------
0000000516758030 00000005167581B8 7752 TX 3080222 128785 6 0 19544 ##########
4. Check the session sid=7752
system@DBNAME> @sess_by_sid
Enter value for sid: 7752
Shadow Remote Remote
SID-SERIAL OS User Username Module Process Process Machine Logon Time Status
------------ -------- ---------------- -------------- ------------ ------------ -------------------- --------------- --------
'7752,55822' doammw27 OLAMLOG 8786 1234 dspcef07 10/26 13:42:04 INACTIVE
5. The following query shows that session sid=7752 is 19367 sec old, and the last call made by it is 19366 sec ago.
system@DBNAME> @trans_long_running.sql
ADDR Status UBAREC START_SCN SYSDATE START_DATE SECS RSSIZE SID LAST_CALL_ET Status Username OS User SHARABLE_MEM
---------------- -------- ---------- ------------------- ------------------- ------------------- ---------- ---------- ----- ------------ -------- ---------------- -------- ------------
0000000516758030 ACTIVE 13 10172725882034 2008-10-26 19:05:54 2008-10-26 13:43:07 19367 1171456 7752 19366 INACTIVE OLAMLOG doammw27
6. After killing the session sid=7752, wait event showed as follows:
COUNT(*) EVENT MAX(SECONDS_IN_WAIT)
---------- --------------------------------------------- --------------------
5943 SQL*Net message from client 6049401
188 SQL*Net break/reset to client 34548
22 rdbms ipc message 42814
1 smon timer 276
1 Streams AQ: waiting for time management or cl 34229
eanup tasks
1 jobq slave wait 47
1 pmon timer 283
1 Streams AQ: qmn slave idle wait 557938
1 Streams AQ: qmn coordinator idle wait 6185956
1 SQL*Net message to client 0
1 Streams AQ: waiting for messages in the queue 5
####---------------------------------------------------------------------------
Appendix - scripts used:
$ cat event.sql rem file: event.sql rem rem Lists the Current Waits in the database. rem First Script to run in the database to debug performance issues. rem This query lists the Count of Sessions group by Wait Event, and rem sorted in Ascending Order. rem Look for Top 5 Wait events from this query. rem Also listed is the maximum time ( seconds) sessions rem have waited against a particular wait event. Count Information is rem more valuable than the Max time information. rem column event format a45 select count(*), event, max(seconds_in_wait) from v$session_wait group by event order by 1 desc / ####--------------------------------------------------------------------------- $ cat qlocks.sql clear columns clear computes clear breaks set linesize 240 set pagesize 40 column sid format 99999 heading "SID" column locktype format A9 heading "Lock Type" column lockreq format A9 heading "Lock Requested" column lockheld format A9 heading "Lock Held" column timeheld format 9999999 heading "Time Held(minutes)" column block format a5 heading "Block" select /* RULE */ l.sid sid, decode(l.type,'TM','DML','TX','Trans','UL','User',l.type) locktype, decode(l.request,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive') lockreq, decode(l.lmode,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive') lockheld, l.ctime/60 timeheld, decode(l.block,0,'No',1,'Yes') block from v$lock l where l.request != 0 or l.block != 0 order by l.id1, l.lmode desc, l.ctime desc / ####--------------------------------------------------------------------------- $ cat blocker.sql select * from v$lock where block > 0 / ####--------------------------------------------------------------------------- $ cat sess_by_sid.sql set linesize 250 set pagesize 1000 set verify off column SidSerial format a12 heading "SID-SERIAL" column sid format 9999 heading "SID" column serial format 99999 heading "Serial " column osuser format a8 heading "OS User" column username format a16 heading "Username" column module format a14 heading "Module" column spid format 999999 heading "ShadowProcess" column process format 999999 heading "RemoteProcess" column machine format a20 heading "RemoteMachine" column time format a15 heading "Logon Time" column status format a8 heading "Status" select ''''||s.sid||','||s.serial# ||'''' SidSerial, --select s.sid sid , --s.serial# serial, s.osuser osuser, s.username username, s.module module, p.spid spid, s.process process, s.machine machine, to_char(s.logon_time, 'mm/dd hh24:mi:ss') time, s.status status from v$session s, v$process p where s.paddr = p.addr (+) and s.sid = &sid / ####--------------------------------------------------------------------------- $ cat trans_long_running.sql column start_scn format 999999999999999999 select t.addr, t.status, t.UBAREC, t.start_scn, SYSDATE, t.start_date, ( (SYSDATE - t.start_date) * 86400 ) secs, r.rssize, s.sid, s.last_call_et, s.status, s.username, s.osuser, sa.sharable_mem from v$transaction t join v$rollstat r on t.xidusn = r.usn join v$session s on s.saddr = t.ses_addr left outer join v$sqlarea sa on s.sql_address = sa.address where s.sid = 7752 /
3 comments:
Hi Denis,
A very good article I must say
BTW, for sess_by_sid.sql, I think the line below:
select ''''s.sid','s.serial#'''' SidSerial,
Should be ...
select '''' || s.sid || ',' || s.serial# || '''' SidSerial,
Can you confirm that? I hope I can be as lucky as you working in the USA :-)
@Newbie - glad you find some useful info here. I corrected the script. Thanks!
Hi Denis,
It would be handy if you can change the tran_long_running.sql to prompt for the sid number. You currently have it hard coded at 7752.
where s.sid = &sid
Nice work.
Post a Comment