关键:
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---
在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的会话,或者咨询研发。