ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 462|回复: 5

[原创] oracle 11g自动杀锁脚本

[复制链接]
认证徽章
论坛徽章:
0
发表于 2018-2-14 12:19 | 显示全部楼层 |阅读模式
               最近临近春节,客户的一套11gRAC下午经常会出现锁,开发人员都回家了无法修改逻辑。为了避免过年期间因为这个每天都播vpn处理,所以赶忙写了一个自动杀锁的脚本。
这个脚本有几点需要注意的:
1.针对于linux系统
2.oracle 11g单实例和RAC都可以
3.考虑到了active的锁不能杀
4.有的锁的锁源会是一些系统进程,担心杀掉以后库会直接宕掉,脚本也考虑到了这一点。
5.客户这台服务器上有两套RAC,为了安全起见,sqlplus前我都export了一下环境变量。

可以把这这个脚本发给值班室的兄弟们,出现了锁跑一下,也可以写到crontab里面。

祝大家春节愉快!


#!/bin/bash

#get lock infomation
export ORACLE_SID=ogg1
sqlplus -s "/as sysdba" <<eof
spool /home/oracle/killholder_tmp.sql
select 'alter system kill session ''' || s.SID || ',' || s.SERIAL# || ',@' ||
       s.INST_ID || ''' immediate;' killsql
  from gv\$lock l, gv\$session s
where (id1, id2, l.type) in
       (select id1, id2, type from gv\$lock where request > 0)
   and l.sid = s.sid
   and l.inst_id = s.inst_id
   and s.status='INACTIVE'
   and s.type='USER'
   and decode(request, 0, 'Holder:', ' Waiter:') = 'Holder:'
order by id1, ctime desc, request;
spool off
exit
eof

#kill the lock holder
more /home/oracle/killholder_tmp.sql |grep '^a' > /home/oracle/killholder.sql
export ORACLE_SID=ogg1
sqlplus -s "/as sysdba" <<eof
@/home/oracle/killholder.sql
exit
eof

#check lock again
export ORACLE_SID=ogg1

sqlplus -s "/as sysdba" <<eof
spool /home/oracle/event.txt
select inst_id, event#, event,count(*) from gv\$session
where wait_class# <> 6
group by inst_id, event#,event
order by 1,4 desc;
spool off
exit
eof
TXLOCKNUM=$(more /home/oracle/event.txt|grep 'TX'|wc -l)
TMLOCKNUM=$(more /home/oracle/event.txt|grep 'TM'|wc -l)
if [ $TXLOCKNUM -eq 0 ] && [ $TMLOCKNUM -eq 0  ]
then
        echo "there is no lock!"
else
        echo "there is still having lock! "
fi           

论坛徽章:
119
现任管理团队成员
日期:2011-05-07 01:45:08弗兰奇
日期:2018-01-31 17:04:24ITPUB15周年纪念
日期:2018-02-08 11:01:54
发表于 2018-2-14 13:29 | 显示全部楼层
额。。这样真的好么?
1. 有些应用的确需要长期持有锁,比如某些ERP,经常select for update,然后去做一些逻辑后再修改提交。自动去杀,可能导致大量的操作失败,建议控制好检查的时间间隔
2. 杀锁,我还是比较支持在OS层面杀,kill session仅仅是修改了paddr,并不能保证pmon立即开始回收锁资源,当然immediate子句可以直接打断被kill session的操作,但是我还是比较喜欢os kill
3. 有时候,一旦一个ssession出现block,会导致连级的多个session被block,其实只需要kill掉顶端的session,就会释放整个block chain,直接用脚本最好用dba_waiter_chain来判断,否则会导致许多无辜的session被kill~

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2018-2-14 14:36 | 显示全部楼层
zergduan 发表于 2018-2-14 13:29
额。。这样真的好么?
1. 有些应用的确需要长期持有锁,比如某些ERP,经常select for update,然后去做一 ...

嗯,感谢提醒,已经从crontab中撤下来了。kill session的内部过程会再去详细了解一下,十分感谢!

使用道具 举报

回复
论坛徽章:
119
现任管理团队成员
日期:2011-05-07 01:45:08弗兰奇
日期:2018-01-31 17:04:24ITPUB15周年纪念
日期:2018-02-08 11:01:54
发表于 2018-2-14 19:21 | 显示全部楼层
水逸冰 发表于 2018-2-14 14:36
嗯,感谢提醒,已经从crontab中撤下来了。kill session的内部过程会再去详细了解一下,十分感谢!

我的意思是建议你改进一下:
1. 根据你对系统理解,给一个合理的检测时间间隔
2. 我不确定immediate是否很有效,看看是否可以用os代替
3. 使用 V$WAIT_CHAINS 来判断lock的源头,只需要杀掉源头就好,别杀太多~

使用道具 举报

回复
论坛徽章:
183
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39金牛座
日期:2015-10-09 17:32:03马上有钱
日期:2014-10-27 09:26:57马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-11-12 09:33:24马上有钱
日期:2014-11-24 15:17:08马上有对象
日期:2015-01-14 17:33:15沸羊羊
日期:2015-02-11 09:07:41懒羊羊
日期:2015-03-04 09:03:43
发表于 2018-2-14 20:23 | 显示全部楼层
^_^,我也写过一个.
主要问题我们的程序太烂.那种写法一定会出现阻塞的,
没有办法,我才不管一律咔嚓,谁半夜起来给你解套...

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2018-2-14 20:29 | 显示全部楼层
1、楼主说的这种场景是锁阻塞,一般来说,系统频繁出现这种情况是不正常的,对已经上线有段时间的系统来说,应该还是后台数据库系统出现了问题,通常情况下,出现性能问题的情况也比较多;但也有可能是应用存在问题;
2、解决这种问题,最好还是从源头解决,靠杀会话的办法,临时救场还可以,但这种解决办法会导致一些任务中断,可能会影响应用的正常使用,例如:某些数据或图表的丢点等。
3、另外,从楼主的SQL语句看,就是想找出阻塞其他会话的会话,然后kill掉,虽然这样实现可以,但感觉有点绕,直接用block>0是不是更简洁呢?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表