get_locked_objects_rpt.sql
在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的更多相关文章
- 为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句
在SQL Server数据库或OACLE数据库当中,通常一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).这是DBA经常会遇到的情况.当出现SQL语句的阻塞时,很 ...
- ORACLE中死锁的知识点总结
死锁的概念 什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包装后,一个抢了枪, 一个逮住了子 ...
- ORACLE中死锁
ORACLE中死锁的知识点总结 死锁的概念 什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包 ...
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
随机推荐
- 关于多字节、宽字节、WideCharToMultiByte和MultiByteToWideChar函数的详解
所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码. 而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE. **************************** ...
- objective-c 语法快速过(3)
oc 里的匿名对象 oc 这里,很少用到,因为并不适用于oc的内存管理,只是面试笔试也许出现,要求能看懂,不要在项目里这样写,因为写匿名对象,会造成内存泄露 #import <Foundatio ...
- slf4j log4j logback关系详解和相关用法
slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...
- 如何用easyui+JAVA 实现动态拼凑datagrid表格
先给大家看一看效果,最近一段时间都在研究这个东西. 如果我把日期间隔选宽呢?比如5月日到5月5日?下面给大家看看效果,不用担心哦 看到了吧,哈哈,这个日期都是动态生成的,下面就来跟大家分享一下这个的实 ...
- inno setup读取注册表遇到的一个坑
一.背景 目前,公司针对PR开发的一个插件需要发布到64位系统上.该插件包括一个prm格式的文件和若干个DLL文件.其中,prm文件需要复制到PR公共插件目录下,DLL需要复制到Windows系统目录 ...
- AngularJs $q promise
angularjs提供的$q服务是对Promises规范的一个实现.$q服务可以把一段异步的代码封装成同步的样式. 为啥是样式,因为异步还是异步,它并不会柱塞代码,只是看起来像同步代码. $q.whe ...
- mvc实现上传图片(上传和预览)webuploader
笔者看到mvc最近比较流行,而很多使用一些比较旧的的方法上传图片,再次安利一下百度的webuploader控件吧 webuploader第一步要先下载一些插件这点可以在webuploader官网上下载 ...
- Python 3.4 Library setup
matplotlib: https://pypi.python.org/pypi/matplotlib/1.4.3 Unofficial Windows Binaries for Python Ex ...
- WPF平台Grid控件性能比较
WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...
- Linux安装JDK1.7
发表此篇文章纯属本人愚钝,希望以后再安装JDK不要走那么多曲折的路,也希望可以给后人借鉴. 1.以下以JDK1.7为例 具体官网地址:http://www.oracle.com/technetwork ...
