问题现状:
前台业务反应平台崩掉,直接表现:卡,慢。
监控发现:
AWR报告top10:
发现enq: TX - row lock contention 等待事件。
问题处理:
查找DBA_HIST_ACTIVE_SESS_HISTORY ,定位具体原因
SELECT tt.SAMPLE_TIME,
dd.OWNER,
dd.OBJECT_NAME,
dd.OBJECT_TYPE,
aa.sql_text,
tt.*
FROM (SELECT D.current_obj#,
D.current_file#,
D.current_block#,
D.current_row#,
D.EVENT,
D.P1TEXT,
D.P1,
D.P2TEXT,
D.P2,
CHR(BITAND(P1, -16777216) / 16777215) ||
CHR(BITAND(P1, 16711680) / 65535) "Lock",
BITAND(P1, 65535) "Mode",
(case
when BITAND(P1, 65535) = 1 then
'null mode'
when BITAND(P1, 65535) = 2 then
'sub-share'
when BITAND(P1, 65535) = 3 then
'sub-exclusive'
when BITAND(P1, 65535) = 4 then
'share'
when BITAND(P1, 65535) = 5 then
'share/sub-exclusive'
when BITAND(P1, 65535) = 6 then
'exclusive'
end) as mode_mc,
D.BLOCKING_SESSION,
D.BLOCKING_SESSION_STATUS,
D.BLOCKING_SESSION_SERIAL#,
D.SQL_ID,
TO_CHAR(D.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI:SS') SAMPLE_TIME
FROM DBA_HIST_ACTIVE_SESS_HISTORY D
WHERE D.SAMPLE_TIME BETWEEN
TO_DATE('2019-12-19 09:30:00', 'YYYY-MM-DD HH24:MI:SS') AND
TO_DATE('2019-12-19 11:50:00', 'YYYY-MM-DD HH24:MI:SS')
AND D.EVENT = 'enq: TX - row lock contention') tt
left join dba_objects dd
on dd.OBJECT_ID = tt.current_obj#
left join v$sql aa
on aa.sql_id = tt.sql_id
执行结果:
通过sql查询发现,大量的delete语句,造成Share锁。根据OBJECT_NAME和OBJECT_TYPE ,很显而易见由于bitmap索引造成大量share锁。
bitmap的特性:位图索引的一个键值,会指向多行记录,所以更新一行就会把该键值指向的所有行锁定。此时会话请求锁的对应的请求模式是4。bitmap索引的物理结构和普通索引一样,也是 B-tree 结构,但它存储的数据记录的逻辑结构为"key_value,start_rowid,end_rowid,bitmap"。由此我们可知,前台业务平凡的更新业务表造成大量的锁等待从而造成严重的数据库性能问题。
故先去除位该图索引,恢复业务,观察业务现状。