Oracle RAC环境下的阻塞(blocking blocked)介绍和实例演示

RAC环境下的阻塞不同于单实例情形,因为我们需要考虑到位于不同实例的session。也就是说之前查询的v$session,v$lock相应的应变化为全局范围来查找。本文提供了2个查询脚本,并给出实例演示那些session为阻塞者,哪些为被阻塞者。有关阻塞的概念以及单实例环境下的阻塞请参考:Oracle 阻塞(blocking blocked)

1、演示环境

scott@DEVDB> select * from v$version where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

--在scott session中发布SQL语句,并未提交
scott@DEVDB> begin
 2 update emp set sal=sal+100 where empno=7788;
 3 update dept set dname='DBA' where deptno=10;
 4 end;
 5 /

PL/SQL procedure successfully completed.

--在leshami session中更新emp对象
leshami@DEVDB> update scott.emp set sal=sal-200 where empno=7788;

--在usr1 session中更新emp对象
usr1@DEVDB> update scott.dept set dname='DEV' where deptno=10;

2、寻找阻塞

scott@DEVDB> @block_session_rac

USER_STATUS   SID_SERIAL   CONN_INSTANCE   SID PROGRAM            OSUSER MACHINE     LOCK_TYPE    LOCK_MODE    CTIME OBJECT_NAME
--------------- --------------- ---------------- ---- ------------------------------ ------- --------------- --------------- ----------- ---------- -------------------------
Blocking ->   '20,1545'    devdb1       20 sqlplus@Linux-01 (TNS V1-V3)  oracle Linux-01    Transaction   Exclusive     666 DEPT
Blocking ->   '20,1545'    devdb1       20 sqlplus@Linux-01 (TNS V1-V3)  oracle Linux-01    Transaction   Exclusive     666 EMP
Waiting     '49,1007'    devdb1       49 sqlplus@Linux-01 (TNS V1-V3)  oracle Linux-01    Transaction   None        618 EMP
Waiting     '933,11691'   devdb2      933 sqlplus@Linux-02 (TNS V1-V3)  oracle Linux-02    Transaction   None        558 DEPT

--通过上述脚本我们可以看到session '20,1545' 锁住了对象DEPT以及EMP,而此时session '49,1007'与'933,11691'处于等待状态。

--下面是另外的一种方式来获取阻塞的情形
scott@DEVDB> @block_session_rac2

BLOCKING_STATUS
----------------------------------------------------------------------------------------------------------------------------
SCOTT@Linux-01 ( INST=1 SID=20 Serail#=1545 ) IS BLOCKING USR1@Linux-02 ( INST=2 SID=933 Serial#=11691 )
SCOTT@Linux-01 ( INST=1 SID=20 Serail#=1545 ) IS BLOCKING LESHAMI@Linux-01 ( INST=1 SID=49 Serial#=1007 )

--Author : Leshami
--Blog  : http://blog.csdn.net/leshami

3、演示中用到的脚本

[oracle@Linux-01 ~]$ more block_session_rac.sql
set linesize 180
col user_status format a15
col sid_serial format a15
col program format a30 wrapped
col machine format a15 wrapped
col osuser format a15 wrapped
col conn_instance format a15
col object_name format a25 wrapped
 SELECT DECODE (l.block, 0, 'Waiting', 'Blocking ->') 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.sid,
     s.program,
     s.osuser,
     s.machine,
     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;

[oracle@Linux-01 ~]$ more block_session_rac2.sql
SELECT DISTINCT
     s1.username
    || '@'
    || s1.machine
    || ' ( INST='
    || s1.inst_id
    || ' SID='
    || s1.sid
    || ' Serail#='
    || s1.serial#
    || ' ) IS BLOCKING '
    || s2.username
    || '@'
    || s2.machine
    || ' ( INST='
    || s2.inst_id
    || ' SID='
    || s2.sid
    || ' Serial#='
    || s2.serial#
    || ' ) '
     AS blocking_status
 FROM gv$lock l1,
    gv$session s1,
    gv$lock l2,
    gv$session s2
 WHERE   s1.sid = l1.sid
    AND s2.sid = l2.sid
    AND s1.inst_id = l1.inst_id
    AND s2.inst_id = l2.inst_id
    AND l1.block > 0
    AND l2.request > 0
    AND l1.id1 = l2.id1
    AND l1.id2 = l2.id2;
(0)

相关推荐

  • Oracle 阻塞(blocking blocked)介绍和实例演示

    阻塞是DBA经常碰到的情形,尤其是不良的应用程序设计的阻塞将导致性能严重下降直至数据库崩溃.对DBA而言,有必要知道如何定位到当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者.本文对此给出了描述并做了相关演示. 1.阻塞及其类型 a.什么是阻塞    一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).也就是说新的会话会被挂起,直到持有锁的会话放弃锁定的资源.大多数情况下,在一个交互式应用中被严重阻塞,即可表明应用逻辑有问题,这才是阻塞的根源. b.阻塞得类型

  • Oracle阻塞(blockingblocked)实例详解

    一.概述: 阻塞是DBA经常碰到的情形,尤其是不良的应用程序设计所造成的阻塞将导致数据库性能的严重下降,直至数据库崩溃.对DBA而言,有必要知道如何定位到当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者.本文对此给出了描述并做了相关演示. 二.演示阻塞: --更新表,注,提示符scott@CNMMBO表明用户为scott的session,用户名不同,session不同. scott@CNMMBO> update emp set sal=sal*1.1 where empno=7788; 1 ro

  • Oracle RAC环境下的阻塞(blocking blocked)介绍和实例演示

    RAC环境下的阻塞不同于单实例情形,因为我们需要考虑到位于不同实例的session.也就是说之前查询的v$session,v$lock相应的应变化为全局范围来查找.本文提供了2个查询脚本,并给出实例演示那些session为阻塞者,哪些为被阻塞者.有关阻塞的概念以及单实例环境下的阻塞请参考:Oracle 阻塞(blocking blocked) 1.演示环境 scott@DEVDB> select * from v$version where rownum<2; BANNER ---------

  • linux环境下安装mysql8.0过程介绍

    目录 前言 一.linux更改yum源(如果MYSQL安装慢可以试) 二.版本 三.安装 四.查看临时密码 五.配置外网可以访问 六.测试 七. 数据库卸载 八. 问题 总结 前言 借助同事写得笔记和自己在配置过程中遇到的坑,做一下记录. 一.linux更改yum源(如果MYSQL安装慢可以试) 简介:因为是官方yum,可能会导致安装比较慢,我们切换到国内的源. 第一步:进入yum配置文件目录 cd /etc/yum.repos.d/ 第二步:备份配置文件(如果后续出现了问题就可以恢复): mv

  • Oracle 分区索引介绍和实例演示

    分区索引(或索引分区)主要是针对分区表而言的.随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引.分区索引的好处是显而易见的.就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现.同时把分区放在不同的表空间可以提高分区的可用性和可靠性.本文主要描述了分区索引的相关特性并给出演示示例. 1.分区索引的相关概念 a.分区索引的几种方式:表被分区而索引未被分区:表未被分区,而索引被分区:表和索引都被分区 b.分区索引可以分为本地分区

  • VMware中linux环境下oracle安装图文教程(一)

    安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装配置系统环境 安装linux , 所有服务都不选择,只是选择安装开发工具,不要安装防火墙(当然也可以在后面关闭)打开终端,执行如下命令,检查安装包,没有的都要安装 make, glibc, libaiocompat-libstdc++, compat-gcc-34, compat-gcc-34-c++, gc

  • Linux环境下Oracle安装参数设置方法详解

    前面讲了虚拟机的设置和OracleLinux的安装,接下来我们来说下Oracle安装前的准备工作. 1.系统信息查看 系统信息查看 首先服务器ip:192.168.8.120 服务器系统:Oracle Linux Server release 6.5 服务器主机名:oracle-learn 查看磁盘空间情况: [root@oracle-learn ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 32G 4.8G 26G

  • linux环境下卸载oracle 11g的过程

    1.停库 [oracle@testdb ~]$ sqlplus / as sysdba SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> exit 2.停监听 [oracle@testdb ~]$ lsnrctl stop LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-DEC-2016 14

  • linux环境下的Oracle部署教程

    一. 环境及相关软件 虚拟机:VMwore Workstation Linux系统:CentOSORACLE: ORACLE_112030_Linux-x86-64 Xmanger软件 二. 安装虚拟机及Linux系统 1. 安装虚拟机 2. 安装Centos 2.1 新建虚拟机 2.2 下一步,选择后续装操作系统 2.3 选择操作系统,选择linux,版本选择centos 64位 2.4 虚拟机命名及文件位置选择 2.6 选择硬盘大小,练习时可选择默认20G 2.7 下一步,即已完成准备创建虚

  • Oracle 11g+windows 环境下Ecology7系统安装过程

    目录 环境: 安装步聚: 其他注意事项: 环境: Windows 8.1 64位Oracle 11g 11.2.0.1.0 64位E-cology 7.1.0.331 安装步聚: 以管理员模式运行Oracle setup.exe文件 根据提示安装Oracle,创建数据库,注意修改连接数(默认为150) 创建用户: 使用SQLPLUS:1)cmd窗口中输入: sqlplus system/密码@数据库名2)测试连接 select name from v$database;创建用户: SQL>CON

  • Java多线程环境下SimpleDateFormat类安全转换

    一.SimpleDateFormat类 package state; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * SimpleDateFormat类负责日期的转换与格式化 * 解决SimpleDateFormat类多线程环境下转换错误问题 * @author zc * */ public class SimpleDateFormatThread e

随机推荐