ChannelDB2

How to find out the SQL statements causing db2 deadlock?

เมื่อพูดถึงเรื่อง dead lock หลายคนคงถอนหายใจเพราะเคยเจอกันมาบ้างไม่มากก็น้อย
ปัจจัยที่ทำให้เกิด dead lock ไม่ว่าจะบน client, server, windows app, web หรือแม้กระทั่ง database นั้น
ล้วนเกิดจากการที่ชุดคำสั่งตั้งแต่สองชุดขึ้นไปใช้ทรัพยากรณ์ในระบบร่วมกันโดยขาดการควบคุมที่ดี จึงก่อให้เกิด
การรอกันเพื่อใช้งานทรัพยากร์ สามารถดูตัวอย่างการเกิด deadlock ได้ที่ นี้

แล้วเราจะหาต้นตอของการทำให้เกิด dead lock ในระบบของเราได้อย่างไรกันล่ะ ยิ่งถ้าเกิดกับระบบที่มีความซับซ้อนแล้วล่ะก็
ลำพังแต่นั่งพิจารณา ตรวจสอบ code และ business เพียงอย่างเดียวคงเหมือนกับการงมเข็มในมหาสมุทร

วันนี้ผมเลยขอนำเสนอ การหาสาเหตุที่แท้จริงของการทำให้เกิด dead lock บนฐานข้อมูล DB2 ครับ
สำหรับใน DB2 นั้นเมื่อเราสร้าง database ขึ้นมา deadlock event monitor ที่ชื่อว่า DB2DETAILDEADLOCK
ก็จะถูกสร้างขึ้นมาด้วยอยู่แล้วครับ เราสามารถสั่ง stop/start ได้ด้วยคำสั่ง

db2 set event monitor db2detaildeadlock state 0
ในกรณีที่ต้องการ stop db2detaildeadlock event monitor

db2 set event monitor db2detaildeadlock state 1
ในกรณีที่ต้องการ start db2detaildeadlock eventmonitor

แต่ในที่นี้ผมขอแนะนำให้ทำการ create dead lock event monitor ของเราเองขึ้นมาดีกว่าครับ
เนื่องจากรายละเอียดที่ได้จาก DB2DETAILDEADLOCK นั้นยังไม่เพียงพอต่อความต้องการ(ของผม)
เริ่มจาก

CREATE EVENT MONITOR DEADLOCKMON FOR
DEADLOCKS WITH DETAILS HISTORY VALUES
WRITE TO TABLE


ซึ่งสามารถดู syntax ได้จาก นี้

เมื่อสร้าง deadlock event monitor ด้วยคำสั่งตามข้างบนแล้ว db2 จะสร้าง table ดังต่อไปนี้ขึ้นมาให้เรา
โดยอัตโนมัติบน schema ที่ตรงตามกับ user ที่รันคำสั่งนี้

1. CONNHEADER_DEADLOCKMON - จะเก็บข้อมูลของ connection ที่ connect เข้ามาครับ
2. DEADLOCK_DEADLOCKMON - เก็บรายการ deadlock พร้อมทั้ง statement สุดท้ายที่ทำให้เกิด deadlock
3. DLCONN__DEADLOCKMON - เก็บรายการ deadlock โดยอ้างอิงตาม application ที่เกี่ยวข้องกับการกิด deadlock
4. DLLOCK_DEADLOCKMON - เก็บรายการ lock ทั้งหมดที่เกี่ยวข้องกับการเกิด deadlock
5. STMTHIST_DEADLOCKMON - เก็บรายการ sql statement ทั้งหมดของแต่ละการทำงานของแต่ละ application
6. STMTVALS_DEADLOCKMON - เก็บ input parameter ของ statement ในข้อ 5

ซึ่งหากใช้คำสั่งแตกต่างไปจากนี้สามารถอ่านละเอียดเพิ่มเติมของแต่ละ table ได้ที่

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topi...

ที่ผมเลือกที่จะใช้วิธีให้ db2 เขียนข้อมูลเกี่ยวกับ deadlock ลง table ก็เพราะให้ง่ายในการค้นหาและปรับเปลี่ยนมุมมองครับ

หลังจากที่เราสร้าง DEADLOCKMON สำหรับเป็น deadlock event monitor เป็นที่เรียบร้อยแล้วขึ้นตอนต่อมาก็
ให้ไปเปิดให้ Heath Monitor ของ db2 ทำงานครับและกำหนดค่าให้กับ Health Monitor ว่าถ้าเกิด deadlock ก็ให้ส่ง mail มาบอกเราครับ
เพื่อที่จะได้ตรวจสอบ แก้ไข และเก็บข้อมูลได้ทันถ่วงทีครับ เสร็จแล้วเราก็เริ่ม start DEADLOCKMON ได้เลยครับ
หลังจากนั้นก็รอรับ mail อย่างเดียว

เมื่อได้รับ mail ว่าเกิด deadlock แล้วเราก็จัดการเปิด db2 font end ขึ้นมาเลยครับและรัน sql statement ดังต่อไปนี้



SELECT
*
FROM
ADMINISTRATOR.DEADLOCK_DEADLOCKMON


เพื่อแสดงรายการ deadlock ทั้งหมดที่เกิดขึ้น


SELECT
AGENT_ID,
APPL_ID,
APPL_ID_HOLDING_LK,
DEADLOCK_ID,
START_TIME,
STMT_TEXT
FROM
ADMINISTRATOR.DLCONN_DEADLOCKMON
ORDER BY
START_TIME


เพื่อ list ออกมาดูว่ามี application ไหนที่ทำให้เกิด deadlock ครับ แนะนำว่าให้ลองพยายามสังเกตุ APPL_ID กับ
APPL_ID_HOLDING_LK ของแต่ละ deadlock id ให้ดีครับ

SELECT
DEADLOCK_ID,
PARTICIPANT_NO,
STMT_FIRST_USE_TIME,
STMT_ISOLATION,
STMT_HISTORY_ID,
STMT_TEXT
FROM
ADMINISTRATOR.STMTHIST_DEADLOCKMON
WHERE
DEADLOCK_ID IN (1,2,3)
ORDER BY
STMT_FIRST_USE_TIME


เพื่อแสดง sql statement ทั้งหมดที่มีส่วนทำให้เกิด deadlock ครับในที่นี้ where condition ของผมนั้นสามารถดัดแปลง
ให้มา join กับ DEADLOCK_DEADLOCKMON ได้ครับ จุดที่น่าสังเกตุคือให้ order by DEADLOCK_ID แล้วพยายาม
พิจารณา statment ประกอบกับ PARTICIPANT_NO ครับแล้วจะพบคำตอบของสาเหตุการเกิด deadlock ครับ

แชน

Views: 1706

Comment

You need to be a member of ChannelDB2 to add comments!

Join ChannelDB2

Comment by Helloauh on September 15, 2009 at 5:20am
ครับ set even monitor ดู deadlock ได้ครับ และ ให้ สั่งทำ even ว่า ท่า เกิด deadlock จะทำอะไรต่องไป จะ force application ส่วนนั้น หรือ จะปล่อย ให้ ทำงาน ต่อ เพราะ อย่างเช่น ทำพวก olap มี การ update data ค้างไว้ หรือ delete ระดับ row แต่ มัน จะ มีปัญหา ในการ manage memory ซึ่งต้องดู องค์ประกอบ หลายอย่าง ส่วน even มัน จะอยู่ ส่วน db2fench ที่ ตอนแรก db2 allocate memory ในการ share ไว้แล้ว ซึ่ง ผม ว่า ใช้ script เขียน monitor ในการ get snapshot ดีกว่าครับ หรือไม่ ก็ ใช้ db2pe เป็น option เสริม ได้ ครับ
Comment by fuangwith on June 23, 2009 at 2:14am
db2 set event monitor db2detaildeadlock state 1
เท่าที่ผมรู้ก็สามารถดู deadlock ได้นะครับโดย db2detaildeadlock จะเป้น event monitor ที่เป็น default มากับ DB2
event monitor ตัวนี้จะเขียนลง file ครับ ซึ่งสำหรับผมแล้ว
ผมไม่ชอบอ่าน format ที่อยู่ใน file อ่ะครับ

ใช้คำสั่ง db2evmon -db -evm db2detaildeadlock
ในการอ่านออกมาอ่ะครับ
Comment by Siripod on June 15, 2009 at 12:22am
ถ้าทำแค่คำสั่งต่อไปนี้ เราจะสามารถดู log deadlock ได้หรือเปล่าครับ
db2 set event monitor db2detaildeadlock state 1
Comment by Siripod on June 15, 2009 at 12:14am
ตกลงเวลาเปิด deadlock monitor ควรจะลง table อย่างเดียว ไม่ต้องลง file หรือเปล่าครับ?
แล้ว default แล้วมันลง table อย่างเดียวหรือเปล่าครับ?
Comment by fuangwith on May 31, 2009 at 12:54pm
ดูจาก message ถ้าผมเข้าใจไม่ผิดคือพื้นที่เก็บ log มันเต็มใช่หรือเปล่าครับ
เวลาสร้าง monitor ให้เขียนลง file เราสามารถกำหนดขนาดไฟล์ได้น่ะครับ แล้วก็สามารถเลือก mode ได้ด้วยอ่ะครับ
ว่าเป็น APPEND หรือ REPLACE

สำหรับตัว DB2DETAILDEADLOCK มันเป็น default ของ DB2 มาน่ะครับ ปกติระบบก็จะเปิดไว้
Comment by pornphan on May 28, 2009 at 5:33am
Hi k แชน

รายละเอียดดีจังค่ะ ทุกวันนี้ ยัง get snapshot อยู่เลย วันนี้ มี ปัญหา
ดังนี้ ค่ะ

009-05-28-14.53.05.904623+420 I498387068A767 LEVEL: Error
PID : 442556 TID : 1 PROC : db2evmli (DB2DETAILDEADLOCK)
INSTANCE: db2inst1 NODE : 000 DB : TOOLSDB
APPHDL : 0-191 APPID: *LOCAL.DB2.090528075315
AUTHID : DB2INST1
FUNCTION: DB2 UDB, database monitor, sqmEvmonWriter::initTarget, probe:40
MESSAGE : ZRC=0x800D002B=-2146631637=SQLM_RC_EVFULL "monitor full of data"
DIA8052C The Event Monitor "" has reached its file capacity. Delete
the files in the target directory "" or move them to another
directory.
DATA #1 : String, 17 bytes
DB2DETAILDEADLOCK
DATA #2 : String with size, 68 bytes
/home/db2inst1/db2inst1/NODE0000/SQL00001/db2event/db2detaildeadlock


แต่ path /home ยังมีพื้นที่ว่าง
แสดงว่า ถ้า write deadlock log to file อาจจะมี limits หรือ เปล่า คะ แนะนำไห้ ลูกค้า ปิด even monitor ไปเลย ดีหรือไม่

คิดว่า ลูกค้าคงไม่ได้ตั้งใจจะเปิดไว้ monitor อะไร นะค่ะ

Featured Downloads

Try BLU Acceleration on Cloud

© 2019   Created by channeldb2.   Powered by

Badges  |  Report an Issue  |  Terms of Service