数据库的系统视图V$SESSION近期出现多次无法查询BLOCKSESSION列数据的问题;对事务锁一类问题的查询处理带来影响。
通过数据库的相关日志及协调ORACLE后台支持分析,已经明确问题原因并给出解决方案,汇总此文档说明此次问题原因及解决措施。
- 问题分析
- 问题现象
业务高峰期,会出现查询v$session视图,blocking_session列显示阻塞进行信息不全的问题。故障现象模拟如下:
Session1:
Update test set name='TEST1' where id=1;
Session2:
Update test set name='TEST1' where id=1;
Session3:
Select inst_id,sid,serial#,event,blocking_instance,blocking_session from gv$session where type='USER' and wait_class <>'Idle';

-
- 问题分析
从故障现象来看,业务高峰期,会出现查询v$session视图,blocking_session列显示阻塞进行信息不全的问题。重启数据库后会恢复正常显示,数据库运行半个月左右后会再次出现此问题。
结合故障现象及协调ORACLE后台支持分析,此问题为BUG。
-
- 问题解决方法
由于数据库版本BUG,安装补丁可以修复此问题但是需要停机较长时间。因此建议使用其他视图进行查询,也可以得到同样的查询结果;
参考查询语句如下:
set linesize 280 pagesize 180
col PROGRAM for a20
col OSUSER for a10
col OBJECT_NAME for a15
col MACHINE for a10
col EVENT for a25
查找数据库中锁的情况及源头:--不包含OSPID
SELECT DECODE (l.BLOCK, 0, 'Waiting', 'Blockering-->') user_status
,CHR (39) || s.SID || ',' || s.serial# || CHR (39) sid_serial
,(SELECT instance_name FROM gv$instance WHERE inst_id = l.inst_id)
conn_instance,s.inst_id
,s.SID
,s.PROGRAM
,s.osuser
,s.machine,
s.sql_id,s.prev_sql_id,s.event
,DECODE (l.TYPE,'RT', 'Redo Log Buffer','TD', 'Dictionary'
,'TM', 'DML','TS', 'Temp Segments','TX', 'Transaction'
,'UL', 'User','RW', 'Row Wait',l.TYPE) lock_type
--,id1
--,id2
,DECODE (l.lmode,0, 'None',1, 'Null',2, 'Row Share',3, 'Row Excl.'
,4, 'Share',5, 'S/Row Excl.',6, 'Exclusive'
,LTRIM (TO_CHAR (lmode, '990'))) lock_mode
,ctime
--,DECODE(l.BLOCK, 0, 'Not Blocking', 1, 'Blocking', 2, 'Global') lock_status
,object_name
FROM
gv$lock l
JOIN
gv$session s
ON (l.inst_id = s.inst_id
AND l.SID = s.SID)
JOIN gv$locked_object o
ON (o.inst_id = s.inst_id
AND s.SID = o.session_id)
JOIN dba_objects d
ON (d.object_id = o.object_id)
WHERE (l.id1, l.id2, l.TYPE) IN (SELECT id1, id2, TYPE
FROM gv$lock
WHERE request > 0)
ORDER BY id1, id2, ctime DESC;
- 总结与后续处理建议
- 问题总结
故障现象为业务高峰期,会出现查询v$session视图,blocking_session列显示阻塞进行信息不全的问题。重启数据库后会恢复正常显示,数据库运行半个月左右后会再次出现此问题。
-
- 解决方案
由于数据库版本BUG导致数据库系统复杂高且较长时间运行后出现的vsession视图,blocking_session列显示阻塞进行信息不全的问题,安装补丁可以修复此问题。但是需要停机较长时间。因此建议使用其他视图进行查询(VLOCK或gv$active_session_history)进行查询,也可以得到同样的查询结果;