[DB2] มาดักดูว่าใครทำ DB ค้าง

ช่วงนี้ DB ที่บริษัทกับที่ Production ชอบค้างอยู่บ่อยๆครับ สำหรับในบริษัทได้ลองเขียน Query เพื่อที่ตรวจสอบว่าใคร Lock Database ซึ่งอาจะเป็นการเปิด Transaction แล้วลืม Commit ก็ได้ครับ สำหรับการทดสอบของผม ผมได้มี Query ชุดนึงที่มีหน้าทีควานหาว่า มีอะไรผิดแปลกกับ Database ครับ โดยผมมีรูปแบบการ Test ดังนี้

  • VM ที่ลง DB2 ไว้ (ถ้าว่างๆจะย้ายลง Docker และ)
  • Dump ข้อมูลใส่ใน Table Activeuser
  • เครื่อง VM นี่แหละ Connect ผ่าน Toad และลบข้อมูล Table Activeuser ผ่าน Toad และปิด Auto Commit ไว้
  • เครื่อง Host ลองเปิด Client App Connect เข้าไป เจอ Error ครับ เท่าที่ User แจ้งมานี่มีหลายแบบ อันนี้เป็นแบบหนึ่ง
  • กลับเข้าไปใน VM เปิด Toad และลอง Run Query ทดสอบอีกครั้ง
SELECT LC.*, 
       T.APPLICATION_NAME, 
       T.CLIENT_WRKSTNNAME, 
       T.APPLICATION_ID, 
       T.CONNECTION_START_TIME, 
       T.CLIENT_IDLE_WAIT_TIME, 
       T.DEADLOCKS, 
       T.LOCK_WAITS_GLOBAL, 
       T.LOCK_TIMEOUTS_GLOBAL, 
       T.LOCK_ESCALS_MAXLOCKS, 
       T.LOCK_ESCALS_LOCKLIST, 
       T.LOCK_ESCALS_GLOBAL 
FROM   SYSIBMADM.LOCKS_HELD LC 
       LEFT OUTER JOIN TABLE(MON_GET_CONNECTION(CAST(NULL AS BIGINT), -2)) AS T 
                    ON T.APPLICATION_HANDLE = AGENT_ID 
WHERE  LOCK_ESCALATION = 0 
       AND DBPARTITIONNUM = 0 
  • ผลลัพธ์ที่ได้ครับ
  • ลองมาจับโจรจาก Query นี้ดูครับ มีข้อมูลที่แกะได้จาก Query ดังนี้
    • Client - win7sp164bit (VM ผมเองครับ)
    • Application - toad.exe
    • Table - SYSTEMCOUNTER, ACTIVEUSER
    • Lock Type - TABLE_LOCK
    • Lock Mode - IX

หากสังเกตุดีๆ Query ตัว SYSIBMADM.LOCKS_HELD หรือ LC ผมเอาหมดเลย เพราะบางตัวผมก็ไม่รู้ครับ และหากนำไปใช้งานจริง อย่างลืมเปิดสิทธิการ Execute ให้กับ "SYSPROC.MON_GET_CONNECTION" ไม่งั้นจะเอามันด่าแนวๆนี้ครับ

DB2 Database Error: ERROR [42501] [IBM][DB2/NT64] SQL0551N  The statement failed because the 
authorization ID does not have the required authorization or privilege to perform the operation.  
Authorization ID: "INVEST".  Operation: "EXECUTE". Object: "SYSPROC.MON_GET_CONNECTION".

และการนำไปใช้งานจริง อาจจะทำเป็น App แบบตอนสมัยปี 1

  • กด 1 dump lock
  • กด 2 exit

เมื่อเวลา DB มันค้าง ให้ DBA ที่ของ Site ลูกค้า Dump ออกมาเป็น TextFile และส่งกับมาที่บริษัทก็ได้ครับ ส่วนตอนนี้ขอไปจับโจรที Production ก่อนครับ