【賽迪網-IT技術報道】在實際的工作和學習中中,許多人經常會遇到sql執行很慢,但是數據庫cpu和記憶體使用率又不高的情況,類似的問題基本上由於鎖,排序等原因造成,本文的核心內容有以下幾點:“描述如何去定位鎖等待問題,誰在鎖等待?等待誰持有的鎖?鎖在那個表?”
一、測試準備
1、先在session1執行如下操作,創建測試表
#db2 connect to eos
#export DB2OPTIONS=+C
#db2 "create table tacy_test (a int not null primary key,b varchar(10))"
#db2 "insert into tacy_test values(1,'a')"
#db2 "insert into tacy_test values(2,'a')"
#db2 "insert into tacy_test values(3,'a')"
#db2 "insert into tacy_test values(4,'a')"
#db2 commit
2、在session2執行如下操作
#db2 connect to eos
#export DB2OPTIONS=+C
二、產生一個lock wait
在session1做一個表更新:
#db2 "update tacy_test set b='b' where a=4"
sql執行成功
在session2做同樣更新操作:
#db2 "update tacy_test set b='c' where a=4"
進程被挂起等待
三、定位鎖等待
1、先來看看應用的情況:
#db2pd -db eos -applications
Database Partition 0 -- Database EOS -- Active -- Up 0 days 07:37:37
Applications:
Address AppHandl [nod-index] NumAgents CoorPid Status C-AnchID C-StmtUID L-AnchID L-StmtUID Appid
0x10140040 8 [000-00008] 1 8425 Lock-wait 80 2 66 1 *LOCAL.db2inst1.071124043739
0x100CE540 7 [000-00007] 1 8358 UOW-Waiting 0 0 80 2 *LOCAL.db2inst1.071124043708
可以看到有一個應用的狀態處於Lock-wait
2、現在我們來看看應用在等什麼
#db2pd -db eos -locks showlock wait
Database Partition 0 -- Database EOS -- Active -- Up 0 days 07:42:56
Locks:
Address TranHdl Lockname Type Mode Sts Owner Dur HldCnt Att Rlse
0x2C8E0760 3 02001806078066020000000052 Row ..X W 2 1 0 0 0x0 TbspaceID 2 TableID 1560 RecordID 0x2668007
鎖的類型為Row(行鎖),X鎖(排他鎖),下面是我們最關心的鎖的位置
TbspaceID 2 TableID 1560 RecordID 0x2668007
其中TbspaceID為表空間ID,TableID為表的ID,RecordID代表具體位置,全部應該是0x0266807,其中前面三個字節為page number,為0x02668,後面一個字節代表solt identifier,為0x07
3、找到相應的表
#db2 "select tbspace,tabschema,tabname,tableid,tbspaceid from syscat.tables where tbspaceid=2 and tableid=1560"
TBSPACE TABSCHEMA TABNAME TABLEID TBSPACEID
------------ ----------- ---------- ------- ---------
USERSPACE1 DB2INST1 TACY_TEST 1560 2
1 record(s) selected.
4、根據RecordID找到鎖在哪行
db2提供了一個強大的數據分析工具db2dart,可以dump出相應的page數據
#db2dart eos /dd /tsi 2 /oi 1560 /ps 157312p /np 1 /v y
Warning: The database state is not consistent.
Warning: Reorg rows MAY be due to the inconsistent state of the database.
DB2DART Processing completed with warning(s)!
Complete DB2DART report found in:
/home/db2inst1/sqllib/db2dump/DART0000/EOS.RPT
其中tsi為表空間id(2),oi為表id(1560),ps為page number(0x0266807),需要轉換為十進位,在結尾必須加p,np代表你要獲取的頁數,v為是否詳細輸出。
1
2
下一頁>>