基于oracle 10.2.0.1 rac死锁deadlock检测时间相关隐含参数及机制之一_lm_dd_interval

背景

   在分析基于oracle 10.2.0.1 rac的死锁时,发现ORACLE检测死锁的时间明显要慢于单实例数据库,当然,这是取决于ORACLE RAC的架构设计;不过我想,肯定会有相关参数控制死锁
检测时间,本文主要研究这方面的相关知识,达到进一步理解基于RAC死锁相关的知识。   


结论

1,基于oracle 10.2.0.1 rac的死锁检测,由参数:_lm_dd_interval控制,其默认值为60,单位为秒
  此参数可以调整,须重启库
2,如果要调整此参数,要从几方面考量下:
   在测试环境进行大量全面测试后,方可上线到生产环境
   查找相关与此参数相关的BUG,避免有此风险
   调整此参数可以引发LMD进程更为繁忙,或者引发RAC数据库数据不一致,因为你想,检测死锁的时间更长了
3,我分析思路如下:
    通过如下脚本  
set linesize 300
col name_1 for a50
col value_1 for a50
col desc1 for a50




select
ksppinm as name_1,
ksppstvl as value_1,
ksppdesc as desc1
from x$ksppi x, x$ksppcv y
where (x.indx = y.indx) and lower(x.ksppinm) like '%&parameter%';


查找关键字lock,找到相关相关参数,进行依次测试,发现不成
然后转换思路,查找关键字lm(其含义为lock manager,即锁管理器),找到相关参数,进行测试对应,最终定位到参数


这个有个最为重要的地方,就是如何理解这些隐含参数:
我的方法:
   1,从参数的命名,进行猜测,
   2,如果参数命名还不能得到参数的含义,结合其注解
   3,然后为其配置不同的值,进行对比测试,了解此参数的真正含义
   4,如果测试完全和你期望不一样,可能是你的方法不对,具体就是要找的隐含参数不对,你要采用新的关键字进行查找
   5,这个到底要用什么新的关键字,就看你对ORACLE原理的理解了,只有你理解更多更深,才能联想到相关的一些技术的关键字
   6,最后如果实在不成,可以BAIDU或GOOGLE,强烈不建议直接查它们,我们要提升自己的分析能力,你直接找到答案,却错过了分析解决的问题的机会,你自己选吧


4,感叹,ORACLE隐含参数确实非常深入,还要很多点要学习   




测试



--oracle version
SQL> select * from v$version where rownum=1;


BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi


---oracle deadlock
SQL> update t_lock set a=11 where a=1;


1 row updated.


SQL> update t_lock set a=22 where a=2;
update t_lock set a=22 where a=2
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource


11g和10g的死锁检测时间不一样,且参数是什么,是否有变化




oracle 10.2.0.1推测与死锁检测相关的参数:
_kgl_time_to_wait_for_locks                        15                                                 time to wait for locks and pins before timing out




不过从死锁检测的时间好像不止是上述指定的15秒哟,超过1分钟了
01:28:50 SQL> update t_lock set a=22 where a=2;
update t_lock set a=22 where a=2
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource




Elapsed: 00:01:08.01




先试着加大上述参数,看有无效果,即可判断是否此参数控制死锁检测的时间


此参数须重启RAC数据库
(2个节点皆操作)
01:31:28 SQL> alter system set "_kgl_time_to_wait_for_locks"=25;
alter system set "_kgl_time_to_wait_for_locks"=25
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified




Elapsed: 00:00:00.00
01:33:12 SQL> alter system set "_kgl_time_to_wait_for_locks"=25 scope=spfile;


System altered.


01:33:44 SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
01:34:08 SQL> startup
ORACLE instance started.


Total System Global Area  599785472 bytes
Fixed Size                  2022632 bytes
Variable Size             260047640 bytes
Database Buffers          335544320 bytes
Redo Buffers                2170880 bytes
Database mounted.
Database opened.


NAME_1                                             VALUE_1                                            DESC1
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
_kgl_time_to_wait_for_locks                        25                                                 time to wait for locks and pins before timing out




重现死锁
01:41:46 SQL> update t_lock set a=22 where a=2;
update t_lock set a=22 where a=2
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource




Elapsed: 00:01:07.81


可见不是上述参数控制死锁检测的时间




我们继续找相关的参数


--可见此参数的值为空
_ksmg_lock_check_interval                                                                             timeout action interval in minutes


同上理,重启库以使参数生效
01:48:17 SQL> conn /as sysdba
Connected.
01:48:52 SQL> alter system set "_ksmg_lock_check_interval"=2 scope=spfile;


System altered.


Elapsed: 00:00:00.13


调整参数已生效
NAME_1                                             VALUE_1                                            DESC1
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
_ksmg_lock_check_interval                          2                                                  timeout action interval in minutes




--重现死锁
01:57:24 SQL> update t_lock set a=22 where a=2;
update t_lock set a=22 where a=2
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource




Elapsed: 00:01:08.60
01:58:46 SQL> 


可见也不是此参数在控制


说明是其它参数在控制着,我们来分析下,我上面获取相关参数的脚本为
set linesize 300
col name_1 for a50
col value_1 for a50
col desc1 for a50




select
ksppinm as name_1,
ksppstvl as value_1,
ksppdesc as desc1
from x$ksppi x, x$ksppcv y
where (x.indx = y.indx) and lower(x.ksppinm) like '%&parameter%';


一直采用lock关键字进行匹配


我们换个思路,会不会要用其它关键字进行查找呢,哪到底是什么关键字呢,我想可能是lm,因为lm表明lock manager锁管理器(当然这个需要你对RAC要有一点的了解)
然后基于上述基础,再查找interval,何义呢,就是多久查找一次,也就是说死锁检测的间隔是多久


_lm_dd_interval                                    60                                                 dd time interval in seconds  --从这个值我看和上述发现死锁的时间差不多
_lm_dd_scan_interval                               5                                                  dd scan interval in seconds






我们调整此参数


调整后
NAME_1                                             VALUE_1                                            DESC1
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
_lm_dd_interval                                    120                                                dd time interval in seconds


重现死锁


02:18:32 SQL> update t_lock set a=11 where a=1;
update t_lock set a=11 where a=1
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource




Elapsed: 00:02:07.87


可见确实是此参数控制死锁检测的时间


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-1826578/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9240380/viewspace-1826578/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值