在写 Oracle session相关数据字典(一)  这篇文章时,提到使用v$session视图的树形查询可以得到Oracle锁树,这样就便于我们找出阻塞会话的源头,但是仅仅可以在单机环境中使用。今天把单机和RAC的阻塞树都整理了一下,话不多说,直接开干,奥利给。

(一)单机的阻塞会话树

单机的不再测试,直接搬以前的记录。EM里面的Blocking session里面看到下图,以折叠图的形式展现,最上面的代表正在阻塞其它session的会话,研究了一下,可以使用v$session来得到类似的效果。

图1.blocking session树形图

我们来做一次测试,对表test01和test02进行DML操作,观察运行情况,操作如下

(1)创建测试表test01,test02。并在2个表的id列添加主键约束

test01表                                                               test02表

(2)对2个表进行操作,执行顺序如下

----------------------------------------test01操作-------------------------------------------------------

[sessid:27  ]  delete from test01;                                          --删除test01整个表的数据,未提交,阻塞源头

[sessid:28  ]  update test01 set name = 'aaa' where id = 1;    --更新test01表id=1的行,会话产生等待

[sessid:142]   insert into test01 values(1,'abc');                     --插入test01表id=1的行,会话产生等待

[sessid:25 ]   delete from test01 where id = 2;                       --删除test01表id=2的行,会话产生等待

[sessid:29 ]   update test01 set  name = 'bbb' where id  = 2;  --更新test01表id=2的行,会话产生等待

-----------------------------------------test02操作--------------------------------------------------------

[sessid:30 ]  insert into test02 values(3,'augly',3000);          --插入test02表id=3的行,未提交,阻塞源头

[sessid:23 ]  insert into test02 values(3,'augly',3300);          --插入test02表id=3的行,会话产生等待

此时我们到EM里面观察,就会发现图1的blocking session树形图。

在实际环境中,大部分系统是没有安装EM的,在没有EM的情况下,我们依然可以通过v$session得到类似的图形

--使用v$session来查看单实例的阻塞session信息

SELECT   LPAD(' ',5*(LEVEL-1))||S."USERNAME" AS user_name ,
LPAD(' ',5*(LEVEL-1))||S."SID" AS session_id,
S."SERIAL#",
S."SQL_ID", S."ROW_WAIT_OBJ#",
S."WAIT_CLASS",
S."EVENT",
S."P1",
S."P2",
S."P3",
S."SECONDS_IN_WAIT"
FROM V$SESSION S
WHERE S."BLOCKING_SESSION" IS NOT NULL
OR S.SID IN(SELECT DISTINCT BLOCKING_SESSION FROM V$SESSION)
START WITH S."BLOCKING_SESSION" IS NULL
CONNECT BY PRIOR S."SID" = S."BLOCKING_SESSION";

结果如下,红色的为阻塞源头:

(二)RAC的阻塞会话树

RAC的阻塞会话,在EM里面是按照实例分开的,没有合并在一起,如下图:

我们尝试将两个图的结果合并在一起,测试如下:

(1)创建测试表,并添加主键

CREATE TABLE test01

(
   ID      NUMBER,
   NAME    VARCHAR(30),
   age     NUMBER

);

ALTER TABLE test01 ADD CONSTRAINT pk_id PRIMARY KEY(ID);

(2)往测试表里面写入数据,形成跨节点的会话阻塞,执行如下:

----------------------------------------test01操作:模拟跨节点阻塞--------------------------------------------

[节点1:会话36]    INSERT INTO test01 VALUES(1,'lijiaman',18);    --节点1插入数据,未提交,阻塞源头

[节点2:会话265]  INSERT INTO test01 VALUES(1,'xiaohua',19);    --节点2插入数据,主键相同,阻塞

[节点1:会话43]    INSERT INTO test01 VALUES(1,'xiaoli',20);        --节点1插入数据,同样被阻塞

----------------------------------------test01操作:模拟同一节点阻塞-------------------------------------------

[节点2:会话34]    INSERT INTO TEST01 VALUES (2, 'b', 18);          --节点2插入数据,未提交,阻塞源头

[节点2:会话275]  INSERT INTO TEST01 VALUES (2, 'c', 18);           --节点2插入数据,主键相同,阻塞

使用如下SQL查询RAC和单节点的会话阻塞:

--使用v$session来查看RAC数据库和单实例阻塞session信息

SELECT
LPAD(' ',5*(LEVEL-1))||S."USERNAME" ,
LPAD(' ',5*(LEVEL-1))||S."INST_ID"||','||S."SID" ,
S."SERIAL#" ,
S."SQL_ID",
S."ROW_WAIT_OBJ#",
S."WAIT_CLASS",
S."EVENT",
S."P1",
S."P2",
S."P3",
S."SECONDS_IN_WAIT",
s."BLOCKING_INSTANCE"||','||s."BLOCKING_SESSION"
FROM GV$SESSION S
WHERE S."BLOCKING_SESSION" IS NOT NULL
OR (S."INST_ID"||','||S."SID") IN(SELECT DISTINCT BLOCKING_INSTANCE||','||BLOCKING_SESSION FROM GV$SESSION)
START WITH (s."BLOCKING_INSTANCE"||','||s."BLOCKING_SESSION") = ','
CONNECT BY PRIOR (S."INST_ID"||','||S."SID") = (s."BLOCKING_INSTANCE"||','||s."BLOCKING_SESSION");

结果如下,红色的是阻塞源头:

【完】

Oracle阻塞会话源头查找-单机和RAC环境的更多相关文章

  1. 【Oracle】11G 11.2.0.4 RAC环境打补丁

    一.准备工作 1,数据库环境 操作系统版本  : RedHat 7.2 x64   数据库版本    : Oracle 11.2.0.4 x64 RAC    Grid          : 11.2 ...

  2. Oracle管理监控 之 rac环境密码文件管理

    密码文件作用: 密码文件用于dba用户的登录认证. dba用户:具备sysdba和sysoper权限的用户,即oracle的sys和system用户. RAC环境中多个节点的密码文件应该保证一致,否则 ...

  3. Oracle RAC环境下定位并杀掉最终阻塞的会话

    实验环境:Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2.常规方法:梳理找出最终阻塞会话 3.改进方法:立即找出最终阻塞会话 之前其实也写过一篇相关文章: 如何定 ...

  4. Oracle RAC环境下定位并杀掉最终阻塞的会话-续

    之前在<Oracle RAC环境下定位并杀掉最终阻塞的会话>中,最终使用一个SQL查询出RAC实例之间的所有阻塞关系.但是实际在某些极端的生产环境,是不允许执行复杂的SQL语句,即使允许执 ...

  5. 如何定位Oracle数据库被锁阻塞会话的根源

    首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...

  6. 数据迁移_把RAC环境备份的数据,恢复到另一台单机Oracle本地文件系统下

    数据迁移_把RAC环境备份的数据,恢复到另一台单机Oracle本地文件系统下 作者:Eric 微信:loveoracle11g 1.创建pfile文件 # su - ora11g # cd $ORAC ...

  7. MySQL Innodb如何找出阻塞事务源头SQL

    在MySQL数据库中出现了阻塞问题,如何快速查找定位问题根源?在实验开始前,我们先梳理一下有什么工具或命令查看MySQL的阻塞,另外,我们也要一一对比其优劣,因为有些命令可能在实际环境下可能并不适用. ...

  8. Oracle活动会话历史(ASH)及报告解读

    对于数据库运行期间的各种状态的实时监控以及相关性能数据捕获对于解决性能问题,提高整体业务系统运行效率是至关重要的.在Oracle数据库中,实时捕获相关性能数据是通过ASH工具来实现的.ASH通过每秒钟 ...

  9. Oracle RAC环境的日志体系

    转摘:http://blog.itpub.net/22664653/viewspace-722463/ 在Oracle RAC环境中比单个系统的日志体系要复杂:见下图: 简单介绍一下有关Oracle集 ...

随机推荐

  1. Mysql 开窗函数实战

    Mysql 开窗函数实战 Mysql 开窗函数在Mysql8.0+ 中可以得以使用,实在且好用. row number() over rank() over dense rank() ntile() ...

  2. P2024 食物链(种类并查集)

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动 ...

  3. muduo网络库源码学习————线程类

    muduo库里面的线程类是使用基于对象的编程思想,源码目录为muduo/base,如下所示: 线程类头文件: // Use of this source code is governed by a B ...

  4. 顺序表的C语言实现

    在现实应用中,有两种实现线性表数据元素存储功能的方法,分别是顺序存储结构和链式存储结构.顺序表操作是最简单的操作线性表的方法.下面的代码实现了顺序表的几种简单的操作.代码如下 //start from ...

  5. VUE生命周期中的钩子函数及父子组件的执行顺序

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...

  6. Jenkins如何进行权限管理

    一.安装插件 插件名:Role-based Authorization Strategy 二.配置授权策略 三.创建用户 四.添加并配置权限 4.1.添加Global Role 普通角色拥有全局只读权 ...

  7. Uncaught DOMException: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.

    今天上传图片遇到这个报错 百度了下,网上说是input标签type=file所以导致的问题,可是我的type=hidden 解决办法: 把上面的代码改成如下问题就解决了

  8. python 矢量数据转栅格数据

    from osgeo import gdal,osr,ogr#定义投影sr = osr.SpatialReference('LOCAL_CS["arbitrary"]')#在内存中 ...

  9. 【杂谈】Disruptor——RingBuffer问题整理(一)

    纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...

  10. python小游戏-pygame模块

    一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...