ORACLE数据库无法查询到V$SESSION的BLOCKSESSION列问题的分析

数据库的系统视图V$SESSION近期出现多次无法查询BLOCKSESSION列数据的问题;对事务锁一类问题的查询处理带来影响。

通过数据库的相关日志及协调ORACLE后台支持分析,已经明确问题原因并给出解决方案,汇总此文档说明此次问题原因及解决措施。

  • 问题分析
    1. 问题现象

业务高峰期,会出现查询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';

    1. 问题分析

从故障现象来看,业务高峰期,会出现查询v$session视图,blocking_session列显示阻塞进行信息不全的问题。重启数据库后会恢复正常显示,数据库运行半个月左右后会再次出现此问题。

结合故障现象及协调ORACLE后台支持分析,此问题为BUG。

    1. 问题解决方法

由于数据库版本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;

  • 总结与后续处理建议
    1. 问题总结

故障现象为业务高峰期,会出现查询v$session视图,blocking_session列显示阻塞进行信息不全的问题。重启数据库后会恢复正常显示,数据库运行半个月左右后会再次出现此问题。

    1. 解决方案

由于数据库版本BUG导致数据库系统复杂高且较长时间运行后出现的vsession视图,blocking_session列显示阻塞进行信息不全的问题,安装补丁可以修复此问题。但是需要停机较长时间。因此建议使用其他视图进行查询(VLOCK或gv$active_session_history)进行查询,也可以得到同样的查询结果;

相关推荐
2501_933670798 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
我要见SA姐111 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
xcLeigh11 小时前
聊聊国产化替换:好用数据迁移工具KDMS怎么帮咱们搞定评估难
数据库·sql·数据迁移·kes·kdms
Elastic 中国社区官方博客12 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
我要见SA姐112 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
数据库·ide·vscode·oracle·编辑器
Nturmoils14 小时前
一份 KDMS 评估报告,怎样排出迁移先后顺序
数据库
这个DBA有点耶14 小时前
异构数据集成怎么做?5 种同步方案对比 + 金融级 CDC 实战解析
数据库·oracle·架构
独泪了无痕14 小时前
SQL函数实战:GREATEST与LEAST的技巧
数据库·sql·mysql
码少女14 小时前
Linux--多路转接之select
java·服务器·数据库
梁辰兴15 小时前
软件工程:软件维护的副作用
数据库·软件工程·梁辰兴·控制方法·软件维护的副作用·副作用类型·副作用原因