น่าจะเป็น Blog แรกของเดือนนี้มั้งที่ได้ Public พอดีช่วงนี้งานเยอะ เลยไม่ได้มาเขียนบ่อยๆ เขาเรื่องเลยและกัน คือ งานชิ้นปัจจุบันของผมใช้งาน Database DB2 ของ IBM ใช้ไปใช้มาพอถึงวันนึง จะ Delete ข้อมูลเท่านั้นแหละ ระบบได้แจ้ง Message เตือนขึ้นมา ดังรูป
ก่อนจะเข้าเรืองกัน เราควรจะมีรู้เรื่องก่อนว่าเจ้า Transaction log คือ อะไร โดยตัว Transaction log มัน คือ บันทึกการทำงานของ Database เราทุกอย่างตั้งแต่ INSERT, UPDATE, DELETE หรือจะเป็นการแก้ไขโครงสร้างข้อมูลครับข้อมูล Log ที่เก็บไว้พวกนี้จะมีประโยชน์ในการใช้ Recovery Database ตอนที่ฐานข้อมูลของเราเกิดปัญหาครับ
คราวนี้กลับมาที่ DB2 กันบ้าง โดยทางแก้ในการจัดการปัญหา SQL0964C Transaction log for database is full คือ การปรับแก้ Parameter LOGFILSIZ, LOGPRIMARY และ LOGSECOND เพื่อเพิ่มพื้นที่การจัดการกับ Transaction log ครับ โดยมีขั้นตอนคร่าวๆ ดังนี้
- Connect เข้า Database ของเราก่อน โดยใช้คำสั่ง
db2 connect to [dbname] USER [dbusername] USING [dbpassword
- เมื่อ Connect เข้าไปได้สำเร็จ ลองใช้พิมพ์คำสั่ง ดังนี้ เพื่อดึงค่า Parameter ของ Database ออกมาครับ
db2 get db cfg for [dbname] show detail
- พอเห็น Result แล้วอย่าตกใจครับ คนถ้าเชี่ยว UNIX/LINUX ใช้ grep เสริมได้ แต่ถ้าสาย Windows คลิกขวาที่หน้าจอ CMD >> Edit เลือก Find จากนั้นค้นหาคำว่า LOG ครับ จะเจอ Parameter ที่เราต้องการแก้ 3 ตัว ด้งรูป
- ก่อนมีเรามาแก้ไขข้อมูลพวกนี้ เราน่าจะรู้ว่า Parameter แต่ละตัวมัน มีความหมายอย่างไร
- LOGFILSIZ ขนาดของ Log File แบบ Primary และ Secondary ในแต่ละ File
- LOGPRIMARY จำนวนของ Primary Log File ที่จะ Pre Allocate ขึ้นมา
- LOGSECOND จำนวนของ Secondary Log File ซึ่งจะถูกสร้างเมื่อตัวระบบต้องการเท่านั้น
- หลังจากเรารู้กันแล้วว่า แต่ละ Parameter คือ อะไรบ้าง เราลองมาคิดพื้นที่ที่ใช้งานกัน
- สูตร logfilsiz * (logprimary + logsecond) * page_size
- แบบเก่า 1024 x (13+4) x 4KB = 69632 KB หรือประมาณ 0.066406 GB
- แบบใหม่ 100,000 x (15+30) x 4KB = 18000000 KB หรือประมาณ 17 GB
จากนั้นเราลองมาแก้ค่า Parameter ของแต่ละตัวกันครับ
- แก้ไข logprimary
db2 update db cfg for [dbname] using logprimary 15
- แก้ไข logsecond
db2 update db cfg for [dbname] using logsecond 30
- แก้ไข logfilsiz
NOTE: ตัวเลข 100000 มันเวอร์ๆอยู่นะ ปรับจาก Default 1024 เพิ่มขึ้นตามความเหมาะสม
db2 update db cfg for [dbname] using logfilsiz 100000
เมื่อแก้ไขข้อมูลครบถ้วนแล้ว เราก็ Restart Database ด้วยคำสั่ง db2stop และ db2start ก็เป็นอันเรียบร้อยครับ (อย่าลืมตรวจสอบว่ามีคนใช้งาน DB อยู่ หรือป่าวนะครับ ฮ่าๆ)
วิธีนี้เป็นวิธิหนึ่งในการแก้ไขนะครับ โดยจะเป็นการขยายพื้นที่เพิ่มสำหรับเก็บ Log แต่จริงๆ ยังมีวิธีดู DB ด้วย db2pd จะได้ kill AppI Id ที่ update / insert / delete แล้ว Transaction Log มันเต็ม
Reference
- http://froebe.net/blog/wp-content/uploads/2013/09/DB2-10.1-LUW-Database-Administration-Concepts-and-Configuration-Reference-IBM-Inc_.pdf
- DB2 transaction log size - IBM Documentation
- How to calculate the DB2 transaction used log size without locking issue (ibm.com)
- How to Fix IBM DB2 LUW Error Message: SQL0964C (xtivia.com)
- [Db2] How to solve transaction log for the databases is full (SQL0964C) (ibm.com)
- "SQL0964C The transaction log for the database is full" running a PowerCenter session that connects to DB2 (informatica.com)
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.