Oracle阻塞会话源头查找-单机和RAC环境
在写 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环境的更多相关文章
- 【Oracle】11G 11.2.0.4 RAC环境打补丁
		
一.准备工作 1,数据库环境 操作系统版本 : RedHat 7.2 x64 数据库版本 : Oracle 11.2.0.4 x64 RAC Grid : 11.2 ...
 - Oracle管理监控 之 rac环境密码文件管理
		
密码文件作用: 密码文件用于dba用户的登录认证. dba用户:具备sysdba和sysoper权限的用户,即oracle的sys和system用户. RAC环境中多个节点的密码文件应该保证一致,否则 ...
 - Oracle RAC环境下定位并杀掉最终阻塞的会话
		
实验环境:Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2.常规方法:梳理找出最终阻塞会话 3.改进方法:立即找出最终阻塞会话 之前其实也写过一篇相关文章: 如何定 ...
 - Oracle RAC环境下定位并杀掉最终阻塞的会话-续
		
之前在<Oracle RAC环境下定位并杀掉最终阻塞的会话>中,最终使用一个SQL查询出RAC实例之间的所有阻塞关系.但是实际在某些极端的生产环境,是不允许执行复杂的SQL语句,即使允许执 ...
 - 如何定位Oracle数据库被锁阻塞会话的根源
		
首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...
 - 数据迁移_把RAC环境备份的数据,恢复到另一台单机Oracle本地文件系统下
		
数据迁移_把RAC环境备份的数据,恢复到另一台单机Oracle本地文件系统下 作者:Eric 微信:loveoracle11g 1.创建pfile文件 # su - ora11g # cd $ORAC ...
 - MySQL Innodb如何找出阻塞事务源头SQL
		
在MySQL数据库中出现了阻塞问题,如何快速查找定位问题根源?在实验开始前,我们先梳理一下有什么工具或命令查看MySQL的阻塞,另外,我们也要一一对比其优劣,因为有些命令可能在实际环境下可能并不适用. ...
 - Oracle活动会话历史(ASH)及报告解读
		
对于数据库运行期间的各种状态的实时监控以及相关性能数据捕获对于解决性能问题,提高整体业务系统运行效率是至关重要的.在Oracle数据库中,实时捕获相关性能数据是通过ASH工具来实现的.ASH通过每秒钟 ...
 - Oracle RAC环境的日志体系
		
转摘:http://blog.itpub.net/22664653/viewspace-722463/ 在Oracle RAC环境中比单个系统的日志体系要复杂:见下图: 简单介绍一下有关Oracle集 ...
 
随机推荐
- 全面解析Java语言 Java技能优化集锦
			
通用篇 "通用篇"讨论的问题适合于大多数Java应用. 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了C ...
 - 一个简单的wed服务器SHTTPD(4)————SHTTPD支持CGI的实现
			
//start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...
 - tinymce富文本编辑器整合到django
			
第一步:定义表存图片路径 models.py class AdminIMG(models.Model): filename = models.CharField(max_length=200, ...
 - KMP+Tire树(模板)
			
\(\color{Red}{KMP板子}\) #include <bits/stdc++.h> using namespace std; const int maxn=1e6+9; int ...
 - python学习之if条件句的使用
			
if循环 if 条件: 代码块 运行 if else的用法 if elseif else用法 if 条件1: elif 条件2: elif条件3: else:
 - python执行脚本报错: Non-ASCII character '\xe4' in file yang.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
			
这是因为我们在写python程序的时候,无论在注释里面出现中文,还是在代码里面出现中文,也就是说只要这个python程序里面有中文,我们就不能直接用python2来进行执行,如果安装是python3可 ...
 - Spring Cloud 系列之 Config 配置中心(一)
			
服务配置现状 配置文件是我们再熟悉不过的,在微服务系统中,每个微服务不仅仅只有代码,还需要连接其他资源,例如数据库的配置或功能性的开关 MySQL.Redis .Security 等相关的配置.除了项 ...
 - 【Hadoop离线基础总结】Apache Hadoop的三种运行环境介绍及standAlone环境搭建
			
Apache Hadoop的三种运行环境介绍及standAlone环境搭建 三种运行环境 standAlone环境 单机版的hadoop运行环境 伪分布式环境 主节点都在一台机器上,从节点分开到其他机 ...
 - indexDB解决过的难题
			
我第一次使用indexDB是1年前(2018年10月),运用这个黑科技,解决过3个异常棘手的问题(如果不是indexDB 几乎找不到其他解决方案)所以我经常强调,前端一定要学indexDB! 难题一: ...
 - python3语法学习第五天--函数(1)
			
函数:函数能提高应用的模块性,和代码的重复利用率,是一段可重复使用的代码块 自定义函数: 1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 2.任何传入参数和自变量必须放在圆括 ...