Oracle阻塞(blockingblocked)实例详解_oracle

一、概述:

阻塞是DBA经常碰到的情形,尤其是不良的应用程序设计所造成的阻塞将导致数据库性能的严重下降,直至数据库崩溃。对DBA而言,有必要知道如何定位到当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者。本文对此给出了描述并做了相关演示。

二、演示阻塞:

--更新表,注,提示符scott@CNMMBO表明用户为scott的session,用户名不同,session不同。
scott@CNMMBO> update emp set sal=sal*1.1 where empno=7788;
1 row updated.
scott@CNMMBO> @my_env

SPID        SID  SERIAL# USERNAME    PROGRAM
------------ ---------- ---------- --------------- ------------------------------------------------
11205       1073    4642 robin      oracle@SZDB (TNS V1-V3)

--另起两个session更新同样的行,这两个session都会处于等待,直到第一个session提交或回滚
leshami@CNMMBO> update scott.emp set sal=sal+100 where empno=7788;

goex_admin@CNMMBO> update scott.emp set sal=sal-50 where empno=7788;

--下面在第一个session 查询阻塞情况
scott@CNMMBO> @blocker 

BLOCK_MSG                        BLOCK
-------------------------------------------------- ----------
pts/5 ('1073,4642') is blocking 1067,10438         1
pts/5 ('1073,4642') is blocking 1065,4464          1
--上面的结果表明session 1073,4642 阻塞了后面的2个
--即session 1073,4642是阻塞者,后面2个session是被阻塞者

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

--下面查询正在阻塞的session id,SQL语句以及被阻塞的时间
scott@CNMMBO> @blocking_session_detail.sql

'SID='||A.SID||'WAITCLASS='||A.WAIT_CLASS||'TIME='||A.SECONDS_IN_WAIT||CHR(10)||'QUERY='||B.SQL_TEXT
------------------------------------------------------------------------
sid=1067 Wait Class=Application Time=5995
 Query=update scott.emp set sal=sal+100 where empno=7788

sid=1065 Wait Class=Application Time=225
 Query=update scott.emp set sal=sal-50 where empno=7788

--下面的查询阻塞时锁的持有情况
scott@CNMMBO> @request_lock_type

USERNAME               SID TY LMODE    REQUEST      ID1    ID2
------------------------------ ---------- -- ----------- ----------- ---------- ----------
SCOTT                1073 TX Exclusive  None      524319   27412
LESHAMI               1067 TX None    Exclusive    524319   27412
GOEX_ADMIN              1065 TX None    Exclusive    524319   27412
--可以看到LESHAMI,GOEX_ADMIN 2个用户都在请求524319/27412上的Exclusive锁,而此时已经被SCOTT加了Exclusive锁

--查询阻塞时锁的持有详细信息
scott@CNMMBO> @request_lock_detail

    SID USERNAME       OSUSER     TERMINAL         OBJECT_NAME     TY Lock Mode  Req_Mode
---------- -------------------- --------------- ------------------------- -------------------- -- ----------- --------------------
   1065 GOEX_ADMIN      robin      pts/1           EMP         TM Row Excl
   1065 GOEX_ADMIN      robin      pts/1           Trans-524319     TX --Waiting-- Exclusive
   1067 LESHAMI       robin      pts/0           EMP         TM Row Excl
   1067 LESHAMI       robin      pts/0           Trans-524319     TX --Waiting-- Exclusive
   1073 SCOTT        robin      pts/5           EMP         TM Row Excl
   1073 SCOTT        robin      pts/5           Trans-524319     TX Exclusive 

三、文中涉及到的相关SQL脚本完整代码如下:

robin@SZDB:~/dba_scripts/custom/sql> more my_env.sql
SELECT spid, s.sid, s.serial#, p.username, p.program
FROM v$process p, v$session s
WHERE p.addr = s.paddr
   AND s.sid = (SELECT sid
          FROM v$mystat
          WHERE rownum = 1);

robin@SZDB:~/dba_scripts/custom/sql> more blocker.sql
col block_msg format a50;
select c.terminal||' ('''||a.sid||','||c.serial#||''') is blocking '||b.sid||','||d.serial# block_msg, a.block
from v$lock a,v$lock b,v$session c,v$session d
 where a.id1=b.id1
 and a.id2=b.id2
 and a.block>0
 and a.sid <>b.sid
 and a.sid=c.sid
 and b.sid=d.SID; 

robin@SZDB:~/dba_scripts/custom/sql> more blocking_session_detail.sql
--To find the query for blocking session

--Access Privileges: SELECT on v$session, v$sqlarea

SELECT   'sid='
     || a.SID
     || ' Wait Class='
     || a.wait_class
     || ' Time='
     || a.seconds_in_wait
     || CHR (10)
     || ' Query='
     || b.sql_text
  FROM v$session a, v$sqlarea b
  WHERE a.blocking_session IS NOT NULL AND a.sql_address = b.address
ORDER BY a.blocking_session
/
robin@SZDB:~/dba_scripts/custom/sql> more request_lock_type.sql
--This script generates a report of users waiting for locks.
--Access Privileges: SELECT on v$session, v$lock

SELECT sn.username, m.sid, m.type,
    DECODE(m.lmode, 0, 'None',
            1, 'Null',
            2, 'Row Share',
            3, 'Row Excl.',
            4, 'Share',
            5, 'S/Row Excl.',
            6, 'Exclusive',
        lmode, ltrim(to_char(lmode,'990'))) lmode,
    DECODE(m.request,0, 'None',
             1, 'Null',
             2, 'Row Share',
             3, 'Row Excl.',
             4, 'Share',
             5, 'S/Row Excl.',
             6, 'Exclusive',
             request, ltrim(to_char(m.request,
        '990'))) request, m.id1, m.id2
FROM v$session sn, v$lock m
WHERE (sn.sid = m.sid AND m.request != 0)
    OR (sn.sid = m.sid
        AND m.request = 0 AND lmode != 4
        AND (id1, id2) IN (SELECT s.id1, s.id2
   FROM v$lock s
            WHERE request != 0
       AND s.id1 = m.id1
                AND s.id2 = m.id2)
        )
ORDER BY id1, id2, m.request;
robin@SZDB:~/dba_scripts/custom/sql> more request_lock_detail.sql
set linesize 190
col osuser format a15
col username format a20 wrap
col object_name format a20 wrap
col terminal format a25 wrap
col Req_Mode format a20
select B.SID, C.USERNAME, C.OSUSER, C.TERMINAL,
    DECODE(B.ID2, 0, A.OBJECT_NAME,
      'Trans-'||to_char(B.ID1)) OBJECT_NAME,
   B.TYPE,
    DECODE(B.LMODE,0,'--Waiting--',
           1,'Null',
           2,'Row Share',
           3,'Row Excl',
          4,'Share',
           5,'Sha Row Exc',
      6,'Exclusive',
            'Other') "Lock Mode",
    DECODE(B.REQUEST,0,' ',
           1,'Null',
           2,'Row Share',
           3,'Row Excl',
           4,'Share',
           5,'Sha Row Exc',
           6,'Exclusive',
           'Other') "Req_Mode"
 from DBA_OBJECTS A, V$LOCK B, V$SESSION C
where A.OBJECT_ID(+) = B.ID1
 and B.SID = C.SID
 and C.USERNAME is not null
order by B.SID, B.ID2;

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索oracle
阻塞
oracle 编程实例详解、c socket 阻塞 实例、非阻塞实例、oracle阻塞、oracle 会话阻塞,以便于您获取更多的相关知识。

时间: 2024-10-31 14:11:46

Oracle阻塞(blockingblocked)实例详解_oracle的相关文章

Oracle触发器用法实例详解_oracle

本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需要说明一下,触发器可以分为语句级触发器和行级触发器.详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发.而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次. 具体举例: 1.

Oracle例外用法实例详解_oracle

本文实例讲述了Oracle例外用法.分享给大家供大家参考,具体如下: 一.例外分类 oracle将例外分为预定义例外.非预定义例外和自定义例外三种. 1).预定义例外用于处理常见的oracle错误. 2).非预定义例外用于处理预定义例外不能处理的例外. 3).自定义例外用于处理与oracle错误无关的其它情况. 下面通过一个小案例演示如果不处理例外看会出现什么情况? 编写一个存储过程,可接收雇员的编号,并显示该雇员的姓名. sql代码如下: SET SERVEROUTPUT ON; DECLAR

Oracle排名函数(Rank)实例详解_oracle

--已知:两种排名方式(分区和不分区):使用和不使用partition --两种计算方式(连续,不连续),对应函数:dense_rank,rank ·查询原始数据:学号,姓名,科目名,成绩 select * from t_score S_ID S_NAME SUB_NAME SCORE 1 张三 语文 80.00 2 李四 数学 80.00 1 张三 数学 0.00 2 李四 语文 50.00 3 张三丰 语文 10.00 3 张三丰 数学 3 张三丰 体育 120.00 4 杨过 JAVA 9

oracle跨库查询dblink的用法实例详解_oracle

本文实例讲述了oracle跨库查询dblink的用法.分享给大家供大家参考,具体如下: 1.创建之前的工作 在创建dblink之前,首先要查看用户是否有相应的权限.针对特定的用户,使用 sqlplus user/pwd登录后,执行如下语句: 复制代码 代码如下: select * from user_sys_privs t where t.privilege like upper('%link%'); 在sys用户下,显示结果为: SYS CREATE DATABASE LINK NO SYS

Oracle存储过程返回游标实例详解_oracle

有俩种方法: 一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为 in out 或out (1)声明个人系统游标.(推荐) 复制代码 代码如下: create or replace p_temp_procedure ( cur_arg out sys_refcursor; --方法1 ) begin open cur_arg for select * from tablename; end 调用 复制代码 代码如下: declare cur_calling sys_refcu

深入oracle分区索引的详解_oracle

表可以按range.hash.list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限性做个总结.局部索引local index1.局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样.2.如果局部索引的索引列以分区键开头,则称为前缀局部索引.3.如果局部索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引.4.局部索引只能依

Oracle 11g Dataguard参数详解_oracle

注:本文译自<Oracle Data Guard 11g Handbook> Page 78 – Page 88 就Data Guard(后面都写成DG)来说,我们只关注如下三种参数: 1.独立于数据库角色的参数 2.数据库角色为primary时的参数 3.数据库角色为standby时的参数 虽然DG有着非常多的配置参数,我们实际使用的只有其中很少的部分,而且因为现在许多的DG功能被集成到了代码中,最近的DG版本中很多配置参数已经被弃用了.需要注意的是,为了便于完成数据库的角色转换(Role

oracle索引介绍(图文详解)_oracle

对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. 索引分类:逻辑分类single column or concatenated  对一列或多列建所引unique or nonunique 唯一的和非唯一的所引,也就是对某一列或几列的键值(key)是否是唯一的.Function-based  基于某些函数索引,当执行某些函数时需要对其进行计算,可以将某些函数的计算结果事先保存并加以索引,提高效率. Doman 

oracle中的视图详解_oracle

1.视图的概述 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表.视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器.(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束) 2.视图的存储 与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据.视图只是定义了一个查询,视图中的数据是从基表中获取