lock to deteck in oracle
0,5,10 0-23 * * * /home/oracle/utility/blocker/detect_blocker.sh db 120 > /home/oracle/utility/trace/detect_blocker_db.log 2>&1
file 1:
echo_usage()
{
echo "Usage : `basename $0` [SID] <sleep time>"
echo $*
echo "Cause: no SID or Database is not running on server"
exit 0
}
if [ $# -lt 2 ]
then
echo_usage
fi
#
# See whether the DB is actually running on this machine or not
#
export ORACLE_SID=$1
ps -ef | grep -v grep | grep ora_smon_${ORACLE_SID} > /dev/null
if [ $? -ne 0 ]
then
echo_usage
fi
export PATH=$PATH:/usr/local/bin
export ORAENV_ASK=NO
. oraenv >/dev/null
export ORAENV_ASK=
export ROOT_DIR=/home/oracle
export SCRIPT_DIR=$ROOT_DIR/utility/blocker
export LOGFILE_DIR=$ROOT_DIR/utility/log
export TMP_DIR=$ROOT_DIR/utility/tmp
EXT="`date '+%y%m%d%H%M%S'`"
FILE1=/tmp/detect_blocker1_$ORACLE_SID.$EXT
FILE2=/tmp/detect_blocker2_$ORACLE_SID.$EXT
OPCMsgCmd=/opt/OV/bin/OpC/opcmsg
SLEEPTIME=$2
${SCRIPT_DIR}/check_blocker $ORACLE_SID | grep -v 'DO NOT KILL' | grep KILL > $FILE1;
sleep $SLEEPTIME;
${SCRIPT_DIR}/check_blocker $ORACLE_SID | grep -v 'DO NOT KILL' | grep KILL > $FILE2;
while read LINE; do
COMPSTR=`echo $LINE | awk '{print $2}'`
if [ `grep $COMPSTR $FILE2 | wc -l` -eq 1 ]; then
echo 'Blocker detected as : ';
echo
echo 'Oracle Session ID/Serial# : ' $COMPSTR
OVOMSG='DB :'${ORACLE_SID}'-Blocker Detected Oracle Session ID/Serial# : '${COMPSTR}', Please keep monitoring system
and donnot kill the blocker until warning messages is exceeding at least 3 times with the same blocker.'
echo $OVOMSG
$OPCMsgCmd s=critical a=db o=blocker msg_grp=db msg_t="${OVOMSG}"
fi;
done < $FILE1
#####
file 2:
dbngd3[/home/oracle/utility/blocker][dbpr] >more check_blocker
#!/usr/bin/sh
#
# This script check whether there is blockers inside the
# database. The script accept DB name as parameter
# and do the checking.
#
echo_usage()
{
echo "Usage : `basename $0` [SID]"
echo $*
exit 1
}
if [ $# -lt 1 ]
then
echo_usage
fi
ORACLE_SID=$1
BASEDIR=/home/oracle/utility/blocker
ORAENV_ASK=NO
PATH=/usr/local/bin:$PATH
. oraenv > /dev/null 2>&1
#
# See whether the DB is actually running on this machine or not
#
EXT="`date '+%y%m%d%H%M%S'`"
echo "Calling check_blocker.sh $1 at time $EXT" >> ${BASEDIR}/check_blocker.log
ps -ef | grep -v grep | grep ora_smon_${ORACLE_SID} > /dev/null
if [ $? -ne 0 ]
then
echo_usage
fi
#
# For support use
#
EXT="`date '+%y%m%d%H%M%S'`"
nohup sqlplus -s oper/oper123 @${BASEDIR}/lck_sql TRUE >/tmp/locktree.$ORACLE_SID.$EXT 2>&1 &
#
# Call light weight check_blocker
sqlplus -s oper/oper123 @${BASEDIR}/lck_sql_lite
#
# Add process listing to log file
nohup ps -elf >> /tmp/oralocktree.$ORACLE_SID.$EXT 2>&1 &
#####
file 3:
Rem LCK_SQL.SQL
Rem ===========
Rem This script reports on conflicting locks using the
Rem procedure LOCK_CONFLICTS created by teh script LCK_PROC.BLD
Rem
Rem It also reports the SQL statements currently in use
Rem by the processes holding / requiring the locks
set serveroutput on size 1000000
set lines 70 echo off trim on;
timing start conflicts;
rem spool $SCRIPT_DIR/lck_sql;
rem spool lck_sql.log
rem execute lock_conflicts('TRUE');
execute lock_conflict('&1');
timing stop;
rem spool off;
set lines 78;
exit
#####
file 4:
Rem LCK_SQL_LITE.SQL
Rem ================
Rem This script reports on conflicting locks using the
Rem procedure LOCK_CONFLICTS created by teh script LCK_PROC.BLD
Rem
Rem It also reports the SQL statements currently in use
Rem by the processes holding / requiring the locks
set serveroutput on size 1000000
set lines 70 echo off trim on;
timing start conflicts;
spool /home/dba/oracle/utility/blocker/lck_sql;
--alter session set events '10046 trace name context forever, level 12' ;
execute lock_conflict_lite;
timing stop;
spool off;
set lines 78;
exit
####
file 5:
create or replace procedure sys.lock_conflict_lite is
level_cnt integer;
indent varchar2(10);
type sid_tab is table of integer index by binary_integer;
type serial_tab is table of integer index by binary_integer;
type dep_cnt_tab is table of integer index by binary_integer;
type kill_nokill_tab is table of varchar2(11) index by binary_integer;
type cpid_tab is table of varchar2(6) index by binary_integer;
type spid_tab is table of varchar2(6) index by binary_integer;
type machine_tab is table of varchar2(64) index by binary_integer;
kill_sid sid_tab;
kill_serial serial_tab;
kill_dep_cnt dep_cnt_tab;
kill_kill_nokill kill_nokill_tab;
kill_cpid cpid_tab;
kill_spid spid_tab;
kill_machine machine_tab;
kill_array integer;
cursor top_level_lock_cur is
select req_sid sid
from v_db_lock
minus -- MINUS
select wait_2.sid
-- from v_db_lock_tab wait_2 -- I am waiting for something
from v_$lock wait_2 -- I am waiting for something
where wait_2.request > wait_2.lmode;
procedure report_sid
( p_sid in integer
) is
cursor session_cur
( p_sid in number
) is
select s.sid kill_sid
, s.serial# kill_serial
, s.sid ora_sid
, s.username ora_username
, s.osuser os_username
, s.process os_process
, s.machine os_machine
, s.sql_address sql_address
, s.sql_hash_value sql_hash_value
, p.spid os_shadow_process
, decode( s.username , 'REPLOG' , 'DO NOT KILL'
, 'DBV_MONTR' , 'DO NOT KILL'
, 'SYS' , 'DO NOT KILL'
, NULL , 'DO NOT KILL'
, 'KILL' ) kill_nokill
from v$process p
, v$session s
where s.sid = p_sid
and p.addr (+) = s.paddr;
session_rec session_cur%ROWTYPE;
begin
open session_cur ( p_sid );
fetch session_cur into session_rec;
close session_cur;
if level_cnt = 1 then
kill_array := kill_array + 1;
kill_sid ( kill_array ) := session_rec.kill_sid;
kill_serial ( kill_array ) := session_rec.kill_serial;
kill_kill_nokill ( kill_array ) := session_rec.kill_nokill;
kill_dep_cnt ( kill_array ) := 0;
kill_cpid ( kill_array ) := session_rec.os_process;
kill_spid ( kill_array ) := session_rec.os_shadow_process;
kill_machine ( kill_array ) := session_rec.os_machine;
elsif kill_array > 0 then
kill_dep_cnt ( kill_array ) := kill_dep_cnt ( kill_array ) + 1;
end if;
end report_sid;
begin
kill_array := 0;
for top_level_lock_rec in top_level_lock_cur
loop
level_cnt := 1;
indent := rpad(' ',level_cnt,chr(9));
report_sid ( top_level_lock_rec.sid );
end loop;
dbms_output.put_line(indent);
dbms_output.put_line('>> **************************************************************** <<');
dbms_output.put_line('>> <<');
dbms_output.put_line('>> The following is a list of the sessions that hold top level locks<<');
dbms_output.put_line('>> and therefore most likely to clear the blockage along with the <<');
dbms_output.put_line('>> number of sessions currently being blocked by the holder. <<');
dbms_output.put_line('>> <<');
dbms_output.put_line('>> SID,Serial# Client,Shadow OSPID DependentCount Kill Advice <<');
dbms_output.put_line('>> <<');
for kill_occurance in 1 .. kill_array
loop
dbms_output.put ('>>');
dbms_output.put ( lpad(kill_sid(kill_occurance),5,' '));
dbms_output.put ( ',');
dbms_output.put ( rpad(kill_serial(kill_occurance),7,' '));
dbms_output.put ( ' ');
dbms_output.put ( lpad(kill_cpid(kill_occurance)||'('||kill_machine(kill_occurance)||')',16,' '));
dbms_output.put ( ',');
dbms_output.put ( rpad(kill_spid(kill_occurance),5,' '));
dbms_output.put ( ' ');
dbms_output.put ( lpad(kill_dep_cnt(kill_occurance),4,' '));
dbms_output.put ( ' ');
dbms_output.put ( rpad(kill_kill_nokill(kill_occurance),11,' '));
dbms_output.put ( ' <<');
dbms_output.new_line;
end loop;
dbms_output.put_line('>> <<');
dbms_output.put_line('>> **************************************************************** <<');
end;
--
file 6
create or replace view sys.v_yict_lock as
select req_0.sid req_sid
, wait_1.sid wait_sid
-- from v_yict_lock_tab req_0 -- people who have a lock
-- , v_yict_lock_tab wait_1 -- and someone waiting for this lock
from v_$lock req_0 -- people who have a lock
, v_$lock wait_1 -- and someone waiting for this lock
where wait_1.type = req_0.type
and wait_1.sid != req_0.sid
and wait_1.request > wait_1.lmode -- What I want is more than what I have
and wait_1.id1 = req_0.id1
and wait_1.id2 = req_0.id2
and ( ( req_0.lmode != 0 and
not exists ( select null
from lock_compatibility_mode -- What you have I want
where lmode1 = req_0.lmode
and lmode2 = wait_1.request )
)
or
( not exists ( select null
from lock_compatibility_mode -- What you want I want
where lmode1 = req_0.request
and lmode2 = wait_1.request ) and
req_0.request > wait_1.request -- You want more than I do
)
)
--
-- exclude info of blocker on IT_ENTITY_LOCK
--
and wait_1.sid not in
(select s.sid
from v$session s
where s.row_wait_obj# in
(select o.object_id
from dba_objects o
where o.object_name = 'IT_ENTITY_LOCK'))
---file 7
select * from sys.LOCK_COMPATIBILITY_MODE
lmode1 lmode2
0 0
0 1
0 2
0 3
0 4
0 5
0 6
1 0
1 1
1 2
1 3
1 4
1 5
1 6
2 0
2 1
2 2
2 3
2 4
2 5
3 0
3 1
3 2
3 3
4 0
4 1
4 2
4 4
5 0
5 1
5 2
6 0
6 1
sample 1:


ALTER SYSTEM KILL SESSION
关于KILL SESSION Clause ,如下官方文档描述所示,alter system kill session实际上不是真正的杀死会话,它只是将会话标记为终止。等待PMON进程来清除会话。
select sid,serial# from v$session where username='DEMO';查询用户的 sid,serial#
可以使用ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE 来快速回滚事物、释放会话的相关锁、立即返回当前会话的控制权。
)
http://blog.csdn.net/haiross/article/details/52703419
lock to deteck in oracle的更多相关文章
- Oracle core06_latch&lock
lock and latch 在oracle中为了保护共享资源,使用了两种不同的锁机制lock和latch,这两种锁有明显不同点: 1,lock和pin,采用的是队列的方式,先来先服务的策略,latc ...
- 转:oracle几组重要的常见视图-v$latch,v$latch_children,v$lock,v$locked_object
v$latch Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串行化锁定机制.Latch的实现是与操作系统相关的, 尤 ...
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)
[等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) 1 BLOG文档结 ...
- 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...
- VM虚拟机下在LINUX上安装ORACLE 11G单实例数据库
1.环境及安装前规划:虚拟机及OS如下 环境:VMware Wordstation ACE版 6.0.2 操作系统:OracleLinux-R5-U8-Server-i386-dvd 3.2G ...
- Oracle 10.2.0.5升级至11.2.0.4
参照MOS 官方文档Complete Checklist for Manual Upgrade to Oracle Database 11gR2 (11.2) (Doc ID 837570.1)一.升 ...
- Oracle 开机自动启动设置
步骤: 1:查看ORACLE_HOME是否设置 $ echo $ORACLE_HOME /u01/app/oracle/product//dbhome_1 2:执行dbstart 数据库自带启动脚本 ...
- CentOS6.5内 Oracle 11GR2静默安装
一.修改配置文件 1.1.修改/etc/security/limits.conf文件,修改用户的SHELL的限制. 输入命令:vi /etc/security/limits.conf,将下列内容加入该 ...
- Oracle Shared Pool机制之——Latches, Locks, Pins and Mutexes
本文中,我们将讨论共享池(Shared Pool)中的各种内存保护结构,即Latches,Locks,Pins和Mutexes. 1. Lathes 当在库缓冲(Libraray Cache)中创建 ...
随机推荐
- 切勿创建包括auto_ptr的容器对象
当你拷贝一个auto_ptr时,它所指向的对象的全部权被移交到拷入的auto_ptr上,而它自身被置为NULL.我的理解是:拷贝一个auto_ptr意味着改变它的值.比如: auto_ptr&l ...
- Find Minimum in Rotated Sorted Array 旋转数组中找最小值 @LeetCode
O(n)的算法就不说了,这题主要考查的是 O(logn)的算法. 有序数组easy想到使用二分查找解决.这题就是在二分基础上做一些调整.数组仅仅有一次翻转,能够知道原有序递增数组被分成两部分,这俩部分 ...
- Android开发:怎样隐藏自己的app应用
本文主要介绍怎样通过改动AndroidManifest.xml清单文件来达到隐藏自身应用的目的,不是隐藏第三方应用.为了不浪费大家时间.特此说明. 转载请注明作者xiong_it和链接:http:// ...
- java SE基础(Collection接口概述)
Collection接口相关集成关系例如以下图 1. 关于可迭代接口(Iterable) 可迭代接口仅包括一个方法,返回一个在一组T类型元素上进行迭代的迭代器: public ...
- jquery全选,取消全选
近期项目又用到了这个全选和取消全选的操作. 曾经总是自己写纯JS.如今既然知道怎么写了.那怎样用JQ写得更简洁呢.这样也能学到新的东西.假设乎百度一下果然发现了好东东.感谢OSC的iuhoay. 代码 ...
- 在windows cgywinportable上,通过运行linux命令,批量改动文件名。
在windows cgywinportable上.通过运行linux命令.批量改动文件名. 实例:将当前文件夹下的全部文件名称加上.sql find ./ -type f -exec mv {} ' ...
- [IT练习册]Python练习项目 思路
1.爬虫:爬取如下网站一年的内容. http://www.calvarymoravian.org/dailytext 2.蛇形棋: 开发一个类似蛇形棋的游戏.最好基于Web. 3.爬虫+通讯录: 从公 ...
- mongo13----application set与分片结合
replation set配合分片 打开3台服务器,B服务器()放configserv, C,D服务器(203.204)放置复制集 .203和192.168.1.204分别运行之前的sh start. ...
- Map dependencies with code maps
https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions Instal ...
- Avoiding memory leaks
Android applications are, at least on the T-Mobile G1, limited to 16 MB of heap. It's both a lot of ...