基于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 '%¶meter%';
查找关键字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 '%¶meter%';
一直采用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
可见确实是此参数控制死锁检测的时间
正文到此结束