在metalink上看到一个脚本(get_locked_objects_rpt.sql),非常不错,如下所示

/*----------------------------------------------------------------------------+

 | MODULE: get_locked_objects_rpt.sql

 |

 | DESCRIPTION:

 |

 | Script to retrieve a list of locked objects from the database and identify

 | the object being locked, and its rowid, and the SQL being blocked.

 |

 | INFORMATION:

 |

 | BRM Performance Tools ...

 |

 | REVISION:

 |

 | $Revision: 1.4 $

 | $Author: pin $

 | $Date: 2013/09/16 13:15:22 $

 +----------------------------------------------------------------------------*/

set serveroutput on size unlimited

set feedback off 

DECLARE

   v_num_sessions INTEGER := 0;

   CURSOR cv IS

SELECT dba_objects.object_name,

       locks_t.row#,

       locks_t.blocked_secs,

       locks_t.blocker_text,

       locks_t.blocked_text,

       locks_t.blocked_sql_text

  FROM (SELECT /*+ NO_MERGE */

               blocking_lock_session.username||'@'||blocking_lock_session.machine||'(SID='||blocking_lock_session.sid||') ['||

               blocking_lock_session.program||'/PID='||blocking_lock_session.process||']' as blocker_text,

               blocked_lock_session.username||'@'||blocked_lock_session.machine|| '(SID='||blocked_lock_session.sid||') ['||

               blocked_lock_session.program||'/PID='||blocked_lock_session.process||']' as blocked_text,

               blocked_lock_session.row_wait_obj#,

               blocked_lock_session.row_wait_file#,

               blocked_lock_session.row_wait_block#,

               blocked_lock_session.row_wait_row#,

               DBMS_ROWID.ROWID_CREATE (1,

                  blocked_lock_session.row_wait_obj#,

                  blocked_lock_session.row_wait_file#,

                  blocked_lock_session.row_wait_block#,

                  blocked_lock_session.row_wait_row#) row#,

               blocked_lock_session.seconds_in_wait blocked_secs,

               blocked_sql.sql_text blocked_sql_text

          FROM v$lock blocking_lock,

               v$session blocking_lock_session,

               v$lock blocked_lock,

               v$session blocked_lock_session,

               v$sql blocked_sql

         WHERE blocking_lock.block = 1

           AND blocking_lock.id1 = blocked_lock.id1

           AND blocking_lock.id2 = blocked_lock.id2

           AND blocked_lock.request > 0

           AND blocking_lock.sid = blocking_lock_session.sid

       AND blocked_lock.sid = blocked_lock_session.sid

           AND blocked_lock_session.sql_id = blocked_sql.sql_id

           AND blocked_lock_session.sql_child_number = blocked_sql.child_number

       ) locks_t,

       dba_objects

 WHERE locks_t.row_wait_obj# = dba_objects.object_id

   AND locks_t.blocked_secs > &1

ORDER BY locks_t.blocked_secs;

 

BEGIN

   FOR cv_rec IN cv LOOP

      dbms_output.put_line(

         '========= $Revision: 1.4 $ ($Date: 2013/09/16 13:15:22 $) ===========');

      v_num_sessions := v_num_sessions + 1;

      dbms_output.put_line('Locked object : '||

         cv_rec.object_name);

      dbms_output.put_line('Locked row#   : '||

         cv_rec.row#);

      dbms_output.put_line('Blocked for   : '||

         cv_rec.blocked_secs||' seconds');

      dbms_output.put_line('Blocker info. : '||

         cv_rec.blocker_text);

      dbms_output.put_line('Blocked info. : '||

         cv_rec.blocked_text);

      dbms_output.put_line('Blocked SQL   : '||

         cv_rec.blocked_sql_text);

   END LOOP;

   dbms_output.new_line;

   dbms_output.put_line('Found '||TO_CHAR(v_num_sessions)||

      ' blocked session(s).');

END;

/

exit;

那么我们来测试一下,新建3个会话来测试验证:

1: 在会话ID为11的窗口执行下面SQL语句

SQL> create table test(id number, name varchar2(12));

 

Table created.

 

SQL> insert into test values(1001,'kerry');

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> update test set name='jimmy' where id=1001;

 

1 row updated.

2:在会话ID为192的窗口执行下面语句。

 

SQL> update test set name='tina' where id=1001;

 

1 row updated.

3: 在会话窗口3执行下面语句查看阻塞或锁定对象情况,输入查询阻塞多少秒以上的SQL

[oracle@DB-Server ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 11.2.0.1.0 Production on Fri Aug 19 16:14:25 2016

 

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

SQL> @get_locked_objects_rpt.sql

Enter value for 1: 10

old  42:    AND locks_t.blocked_secs > &1

new  42:    AND locks_t.blocked_secs > 10

========= $Revision: 1.4 $ ($Date: 2013/09/16 13:15:22 $) ===========

Locked object : TEST

Locked row#   : AAASEkAAEAAAADUAAA

Blocked for   : 34 seconds

Blocker info. : TEST@DB-Server.localdomain(SID=11)

[sqlplus@DB-Server.localdomain (TNS V1-V3)/PID=3971]

Blocked info. : TEST@DB-Server.localdomain(SID=192)

[sqlplus@DB-Server.localdomain (TNS V1-V3)/PID=4046]

Blocked SQL   : update test set name='tina' where id=1001

Found 1 blocked session(s).

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

参考资料:

Information To Collect When High Row-Lock Contention Is Seen In The BRM DB (文档 ID 1356147.1)

get_locked_objects_rpt.sql的更多相关文章

  1. 为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句

    在SQL Server数据库或OACLE数据库当中,通常一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).这是DBA经常会遇到的情况.当出现SQL语句的阻塞时,很 ...

  2. ORACLE中死锁的知识点总结

      死锁的概念 什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包装后,一个抢了枪, 一个逮住了子 ...

  3. ORACLE中死锁

    ORACLE中死锁的知识点总结   死锁的概念 什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包 ...

  4. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  5. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  6. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

  7. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  8. EntityFramework Core Raw SQL

    前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...

  9. 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)

    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...

随机推荐

  1. spring笔记--事务管理之声明式事务

    事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...

  2. C++异常处理: try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  3. C#+JQuery+.Ashx+百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计

    在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的echarts作为报表基础类库.echarts功能强大,界 ...

  4. siteMap与站点导航

    ASP.NET 站点导航主要由与站点地图数据源通信的站点地图提供程序以及公开站点地图提供程序的功能的类构成.ASP.NET 站点导航使您能够将到您所有页面的链接存储在一个中心位置,并通过包含一个用于读 ...

  5. 在Windows Server 2012 R2的Hyper-V中设置虚拟机启用增强会话模式

    在Windows Server 2012 R2的Hyper-V中,可以为虚拟机提供一种全新的连接方式,就是“增强会话模式”,它将让您更加方便的对虚拟机进行操作,比如分辨率的调整.设备的加载,最为方便的 ...

  6. 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作

    关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...

  7. Visual Studio 2015在.NET Core RC2项目中的一个错误。

    更新了.NET Core RC2 之后,VS的Web Tools更新为“Preview 1”了. 这个版本有一个问题,害我折腾了一个下午. 就是在项目界面的“依赖项 - NPM”上面错误地显示了不必要 ...

  8. PHP使用mysqli扩展库实现增删改查(面向对象版)

    mysqli扩展库是mysql扩展库的改进版本,在mysql扩展库的基础上提高了稳定性和效率,mysqli扩展库有两套东西,一套就是面向过程的mysqli另一套是面向对象的mysqli.操作方式大体和 ...

  9. 转载:C#中的泛型

    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具 ...

  10. [TypeScript] 建立与使用AMD Library

    [TypeScript] 建立与使用AMD Library 前言 使用Visual Studio开发TypeScript项目时,开发人员可以将可重用的程序代码,封装为AMD Library来提供其他开 ...