共计 1556 个字符,预计需要花费 4 分钟才能阅读完成。
注释:
这里通过 Oracle 查询锁之间的依赖关系 的 SQL 查询生产环境锁;
由于 Oracle 查询锁之间的依赖关系 查询数据比较全(例如:锁和被锁关系,锁的对象,等待事件,操作锁的客户端,会话跑的 sql,等状态.)若在每个 SQL 锁的对象较多、操作人较多、且最源头锁对象的 sid 不断变化时;想通过 Oracle 查询锁之间的依赖关系 再右眼查到最源头锁 sid 比较费事。
所以特写如下 SQL 实现 Oracle 查找锁之间依赖关系的最源头 SID (首先得到锁的 SID),再通过 SID 找 sql 查问题..
*** 思路 ***
1、证明有锁,需要满足 v$session.BLOCKING_SESSION[阻塞会话的 SID] IS NOT NULL and BLOCKING_SESSION_STATUS = ‘VALID’ 条件;
2、阻塞会话的 SID 不在 SID 中就是最源头的 SID (首先得到锁的 SID);
3、注意:v$session 单实例,gv$session 多节点;
SQL:
WITH LOCK_1 AS
(SELECT DISTINCT S.INST_ID, S.SID, S.BLOCKING_SESSION, S.LAST_CALL_ET
FROM GV$SESSION S
WHERE S.BLOCKING_SESSION IS NOT NULL
and BLOCKING_SESSION_STATUS = ‘VALID’ )
SELECT DISTINCT BLOCKING_SESSION
FROM LOCK_1
WHERE BLOCKING_SESSION NOT IN (SELECT SID FROM LOCK_1);
——————————————————————————–
本文用到的 2 个字段:
V$SESSION displays session information for each current session.
Column | Datatype | Description |
---|---|---|
SID | NUMBER | Session identifier |
BLOCKING_SESSION_STATUS | VARCHAR2(11) | This column provides details on whether there is a blocking session: VALID – there is a blocking session, and it is identified in the BLOCKING_INSTANCEand BLOCKING_SESSION columns NO HOLDER – there is no session blocking this session NOT IN WAIT – this session is not in a wait UNKNOWN – the blocking session is unknown |
BLOCKING_SESSION | NUMBER | Session identifier of the blocking session. This column is valid only ifBLOCKING_SESSION_STATUS has the valueVALID. |
** SQL 写的不是很智能,但能实现我的目的!**
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-11/148847.htm