DB2 SQL1652N File I/O error occurred.

อันนี้มา Recap กันก่อน พอดี API ใน DEV ENV มันล่ม เลยลองเข้าไปหาเขียน Step ไว้นิดนึง

อย่างแรกตรวจก่อนเลยว่าสภาพ Disk เป็นอย่างไร ด้วยคำสั่ง df -h

[invsins1@invsprddb ~]$ df -h
Filesystem                       Size  Used Avail Use% Mounted on
devtmpfs                         1.8G     0  1.8G   0% /dev
tmpfs                            1.9G   20K  1.9G   1% /dev/shm
tmpfs                            1.9G  187M  1.7G  11% /run
tmpfs                            1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/rhel-root            5.0G  3.8G  1.3G  76% /
/dev/mapper/rhel-opt             5.0G  2.0G  3.1G  39% /opt
/dev/mapper/invsins2-invsins2     60G   49G   12G  82% /invsins2
/dev/mapper/db2backup-db2backup   80G  6.6G   74G   9% /db2backup
/dev/mapper/rhel-home             20G   20G   20K 100% /home
/dev/sda1                        5.0G  224M  4.8G   5% /boot
/dev/mapper/invsins1-invsins1     60G   60G   36K 100% /invsins1
/dev/mapper/rhel-var             5.0G  1.5G  3.5G  30% /var
tmpfs                            679M     0  679M   0% /run/user/1000

ลองหาดูว่าใน /home และ invsins1 อันไหนทำบวม

du -ah /home 2>/dev/null | sort -rh | head -n 50
du -ah /invsins12>/dev/null | sort -rh | head -n 50

ผมเดาไว้ก่อนว่าเป็นพวก Archive Log พัง db2diag

หลังจากไล่ผมมาจริงด้วย

  • /invsins1/BFMDB/archive/invsins1/BFMDB/NODE0000/LOGSTREAM0000/C0000003 มี Tx Log เต็มเลยครับ
  • /home/invsins1/sqllib/db2dump/DIAG0000 มีไฟล์ diaglog 16 GB

สรุปสาเหตุ และวิธีแก้

สรุป archive log เต็ม พอเต็มเสร็จมันทำ diaglog มันเขียน log ซึ่งการแก้ไข

  • ลบ diaglog ถ้าไฟล์ใหญ่มากแบบของผม ทำใจครับ เอามาหาตัวเปิดยาก
# ตรวจสอบ DB2 diagnostic logs
cd $DIAGPATH
ls -lth *.log

# ลบ log files เก่าๆ (ระวังให้แน่ใจว่าสำรองแล้ว)
find . -name "*.log" -mtime +30 -exec rm {} \;
  • ลบ diaglog เพื่อให้เรา Run พวก db2stop / db2start ได้ครับ
  • จากนั้นลบ Archive Log แนะนำให้มัน backup ก่อนนะครับ เผื่อมีเคสที่ต้องใช้งาน และ Clear โดย Command
# ตรวจสอบ log path
db2 get db cfg for <DBNAME> | grep -i log

# ไปที่ directory ของ archive logs
cd <archive_log_path>

# ลบ archive logs เก่า (หลังจาก backup แล้ว)
rm -f S*.LOG
  • จากนั้น kill process DB2 ที่ค้าง
# ลอง kill process ทั้งหมด
ipclean -a

# Stop DB2
db2stop force

# หรือถ้ายังไม่ได้ ใช้
db2_kill
db2stop
  • สุดท้ายเมื่อ Start ได้ลอง backup อีกทีครับ
# Start DB2
db2start

# Connect to database
db2 connect to <DBNAME>

db2 backup database <DBNAME> to /backup/path compress

# Prune archive logs
db2 prune history <timestamp> and delete
  • ถ้าทำ HADR อย่างลิมตรวจ Status

การป้องกัน

  • คำถามแรก จำเป็นต้องใช้ Archive Log ทำพวก HADR ถ้าไม่ปรับไปใช้ circular log ถ้าสงสัยว่าแต่ละแบบต่างอย่างไรลองดูจาก Blog [DB2] Backup DB2 offline/online and database logs
db2 update db cfg for <DBNAME> using LOGARCHMETH1 OFF
  • ตั้งค่า automatic log cleanup:
db2 update db cfg for <DBNAME> using LOGARCHMETH1 'DISK:/archive/path'
db2 update db cfg for <DBNAME> using NUM_LOG_SPAN 3

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.