解决数据库锁表问题

关键:
zjbusdb_s:/home/informix> onstat -u|sort -rnk 8|more
700000b14a2f1c0  Y-BP--- 246934   car3g    -        700000b27f6a898  0    2687  27890    7149
700000c0e42e270  Y-BP--- 176507   car3g    -        700000ab2fe7bc0  0    87    94379    4137
700000ba0a81510  --BPX-- 282758   car      -        0                0    74    99625    6714
700000aaf949b30  Y-BP--- 6493     prpuw3g  -        700000b251fe848  0    64    227136   26963
700000af9a8dac0  Y--P--- 169935   car3g    -        700000ac5d1d828  0    9     326520   4252
700000af9a682c8  Y--P--- 169914   car3g    -        700000b18357db0  0    8     2149     10
700000aa550f310  Y--P--- 169922   car3g    -        700000aace99858  0    8     72547    1057
700000b51ef5fe8  Y--P--- 8350     car      -        700000ab9d82ce0  0    7     91       2
zjbusdb_s:/home/informix> onstat -g ses 246934

1.持有锁的session一直没有提交。
  在onstat -g ses owner的输出中flags为:Y-BP---   
如果确定是该表上面的锁导致很多锁等待的情况,可以onmode -z session-id杀掉该会话。

输入: onstat -u|sort -rnk 8|more
显示:700000b14a2f1c0  Y-BP--- 246934   car3g    -        700000b27f6a898  0    2687  27890    7149
输入:onmode -z 246934   
 



 
焦文武  
北京融海恒信咨询有限公司   软件支持服务中心
TEL:13269051731
     010-82193399-201
日期:2012-08-02
,你好:

1.检查是否有锁等待:
onstat -u|grep L-
或者onstat -u|grep S-
结果分析:
onstat -u|grep L-检查是否有session在等待锁,如果输出较多,需要注意。
onstat -u -r 2|grep L-    每2秒输出一次检查结果
onstat -u|grep S-检查是否有互斥锁,如果有输出,需要注意。(一般不会出现)
例:
zjbusdb_s:/home/informix> onstat -u -r 2 |grep L-
700000ba0aa1ad8  L--PR-- 280917   car3g    -        700000db8380a28  30   5     137672   488
700000ba0aa1ad8  L--PR-- 280917   car3g    -        700000da5cc9da8  30   5     137672   488
700000aee081000  L--PR-- 281013   car3g    -        700000cb38b7c28  30   6     3081     1820
700000aee063b88  L--PR-- 278458   car3g    -        700000cdcea8b28  30   6     6758     4750
700000aee063b88  L--PR-- 278458   car3g    -        700000cdcea8b28  30   6     6758     4750
如果第三列的会话号持续很长时间,说明该会话涉及的数据被长期加锁。需要注意。
如果第三列的会话号持续很短时间,说明涉及的锁被及时释放。

#################################################################################################
使用onstat -k|grep HDR+X检查排它锁的情况
首选需要知道表的partnum:
select hex(partnum) from car3gdb:systables where tabname='paymentlog';
输出是:0x00E00012
在onstat -k|grep HDR+X匹配该partnum:
onstat -k|grep HDR+X | grep e00012
例:
zjbusdb_s:/home/informix> onstat -k|grep HDR+X | grep e00012
7000000491d1458  0                700000afc09c988    700000cb1745ca8  HDR+X    e00012   20a0e03     0    I 
如果输出很多,说明该表有很多锁。
找到持有锁的人执行的SQL:
zjbusdb_s:/home/informix> onstat -u|grep 700000afc09c988
700000afc09c988  Y--P--- 280834   car3g    -        700000ac6d06d20  0    5     6579     3785
查找该session:
zjbusdb_s:/home/informix> onstat -g ses 280834


#################################################################################################
使用查询表syslocks的方法找持有锁的session:
dbaccess sysmaster
select owner from syslocks where tabname ='paymentlog';
如果某owner持续的时间很长,需要关注该session在做什么。
如果两次执行该查询SQL输出的结果不同,可以认为某个owner占用锁的时间不长。
owner是会话号,使用onstat -g ses owner找到SQL
此方法不一定可以及时抓到持锁的SQL,除非该持锁的SQL持续很长时间。

#################################################################################################
对于持有锁数量较多的session的关注:
onstat -u|sort -rnk 8|more
需要多次执行以上命令,关注输出的倒数第三列。
如果倒数第三列很大,或者多次比较具有很大的变化,关注该SQL在做什么:
zjbusdb_s:/home/informix> onstat -u|sort -rnk 8|more
700000b14a2f1c0  Y-BP--- 246934   car3g    -        700000b27f6a898  0    2687  27890    7149
700000c0e42e270  Y-BP--- 176507   car3g    -        700000ab2fe7bc0  0    87    94379    4137
700000ba0a81510  --BPX-- 282758   car      -        0                0    74    99625    6714
700000aaf949b30  Y-BP--- 6493     prpuw3g  -        700000b251fe848  0    64    227136   26963
700000af9a8dac0  Y--P--- 169935   car3g    -        700000ac5d1d828  0    9     326520   4252
700000af9a682c8  Y--P--- 169914   car3g    -        700000b18357db0  0    8     2149     10
700000aa550f310  Y--P--- 169922   car3g    -        700000aace99858  0    8     72547    1057
700000b51ef5fe8  Y--P--- 8350     car      -        700000ab9d82ce0  0    7     91       2
zjbusdb_s:/home/informix> onstat -g ses 246934

IBM Informix Dynamic Server Version 11.50.FC7     -- On-Line -- Up 11 days 18:38:34 -- 62452192 Kbytes

session           effective                            #RSAM    total      used       dynamic 
id       user     user      tty      pid      hostname threads  memory     memory     explain 
246934   car3g    -         -        -1       ::ffff:3 1        5349376    4169496    off 

tid      name     rstcb            flags    curstk   status
310587   sqlexec  700000b14a2f1c0  Y-BP---  6064     cond wait  netnorm   -

Memory pools    count 2
name         class addr              totalsize  freesize   #allocfrag #freefrag 
246934       V     700000cf81ab040  5345280    1179072    6812       507       
246934*O0    V     700000bb1528040  4096       808        1          1         

name           free       used           name           free       used      
overhead       0          6576           mtmisc         0          4664      
scb            0          144            opentable      0          308728    
filetable      0          41704          ru             0          600       
log            0          16536          temprec        0          81056     
keys           0          192208         ralloc         0          3045168   
gentcb         0          1584           ostcb          0          3400      
sort           0          104            sqscb          0          287088    
sql            0          72             rdahead        0          416       
hashfiletab    0          552            osenv          0          2648      
buft_buffer    0          8432           sqtcb          0          65520     
fragman        0          86928          sapi           0          2712      
udr            0          12656          

sqscb info
scb              sqscb            optofc   pdqpriority optcompind  directives
700000ab97010e8  700000cf5c61028  0        0           0           1         

Sess       SQL            Current            Iso Lock       SQL  ISAM F.E. 
Id         Stmt type      Database           Lvl Mode       ERR  ERR  Vers  Explain    
246934     SELECT         car3gdb            CR  Wait 30    0    0    9.28  Off        

Current statement name : _ifxc0000000001nwa

Current SQL statement :
  select sftosettle_.receserino, sftosettle_.suffixno, sftosettle_.agentcode
    as agentcode341_, sftosettle_.agentname as agentname341_,
    sftosettle_.businessnature as business5_341_, sftosettle_.certino as
    certino341_, sftosettle_.certitype as certitype341_, sftosettle_.comcode
    as comcode341_, sftosettle_.currency as currency341_, sftosettle_.deskdate
    as deskdate341_, sftosettle_.deskfee as deskfee341_,
    sftosettle_.docfeetype as docfeetype341_, sftosettle_.extractcode as
    extract13_341_, sftosettle_.extractdate as extract14_341_,
    sftosettle_.flag as flag341_, sftosettle_.handlercode as handler16_341_,
    sftosettle_.handlername as handler17_341_, sftosettle_.handlertype as
    handler18_341_, sftosettle_.insuredcode as insured19_341_,
    sftosettle_.insuredname as insured20_341_, sftosettle_.policyno as
    policyno341_, sftosettle_.remark as remark341_, sftosettle_.riskcode as
    riskcode341_, sftosettle_.serialno as serialno341_, sftosettle_.sffreason
    as sffreason341_ from sftosettle sftosettle_ where
    sftosettle_.receserino=? and sftosettle_.suffixno=?

Host variables :
   address            type       flags value
   -----------------------------------------
   0x0700000d23976438 CHAR       0x000 R3310080020120300844
   0x0700000d239764c8 INT        0x000 16
   
如果确定是该表上面的锁导致很多锁等待的情况,可以onmode -z session-id杀掉该会话。

#################################################################################################
为何会出现锁等待的情况:
onstat -u -r 2|grep L-如果有很多输出,说明当前实例很多锁等待的情况。它们在等待持有锁的SQL释放资源。
锁为何没有及时被释放:
1.持有锁的session一直没有提交。
  在onstat -g ses owner的输出中flags为:Y-BP---   (注意第三个B,意为begin work)
2.持有锁的session执行的很慢,可能有新能的优化空间。需要具体分析。
对于第1中可能,需要知道执行该SQL的会话,或者咨询研发。


  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值