WAL (Write-Ahead Log)

Log ของ changes ที่กำลังจะทำ เขียนลง disk ก่อน เขียน data จริง — กลไกหลักสำหรับ durability และ crash recovery

3 ชนิด Log ใน DBMS

Write-Ahead Log (WAL)

  • Log ของ changes ที่กำลังจะทำ ก่อนเขียน data จริง
  • กฎเหล็ก: WAL flush ลง disk ก่อน data flush เสมอ
  • ใช้สำหรับ: crash recovery — replay WAL หลัง crash
  • PostgreSQL เรียก WAL, MySQL InnoDB เรียก redo log (สิ่งเดียวกัน)

Redo Log

  • เก็บ “ทำใหม่อีกครั้ง” ของแต่ละ operation
  • ใช้สำหรับ: roll-forward หลัง crash → reapply changes ที่ committed แต่ยังไม่ flush

Undo Log

  • เก็บ “ยกเลิก” version ของ row ก่อน update
  • ใช้สำหรับ:
    • ROLLBACK → ดู undo log แล้วคืนค่าเดิม
    • MVCC — reader เห็น old version ผ่าน undo log (Oracle, MySQL ใช้)

Postgres vs MySQL

ด้านPostgreSQLMySQL InnoDB
WAL/RedoWALRedo Log (สิ่งเดียวกัน)
Undoไม่ใช้ undo log แบบดั้งเดิมใช้ undo log เก็บ old version
MVCCTuple versioning ใน heapUndo log เก็บ old version แยก
Rollbackเร็วมาก (แค่ mark abort)ต้อง apply undo log
ข้อเสียHeap bloat → ต้อง VACUUMUndo tablespace management

Durability — fsync()

Application → DB Process → OS Page Cache → Disk Controller Cache → SSD/HDD

ทุก layer มี cache → DB คิดว่า “เขียนสำเร็จ” แต่อาจยังไม่ถึง physical media

fsync() = บังคับ flush ทุก layer → physical disk

ปัญหา

  • บาง SSD โกหก เรื่อง fsync — ตอบสำเร็จก่อน flush จริง
  • ไฟดับ → data หาย → durability พัง

Mitigation

  • Enterprise SSD มี battery-backed cache (รักษา cache แม้ไฟดับ)
  • Disable disk cache (ช้าลงแต่ปลอดภัย)
  • Cloud providers (AWS EBS, GCP Persistent Disk) จัดการให้แล้ว

WAL กับ Replication

Database Replication ใช้ WAL เป็นกลไก stream changes จาก master ไป replica — standby รับ WAL segments แล้ว replay

Key Points

  • WAL = เขียน log ก่อน data เสมอ → crash → replay log กู้ได้
  • Redo log = ทำใหม่, Undo log = ยกเลิก
  • Postgres ไม่ใช้ undo log — ใช้ tuple versioning ใน heap + VACUUM
  • fsync() บังคับเขียนลง disk จริง — SSD บางรุ่นโกหก
  • WAL ยังใช้สำหรับ replication (stream ไป standby)
  • ACID — WAL เป็นกลไกหลักของ Durability
  • Database Replication — WAL streaming
  • PostgreSQL — WAL, VACUUM, tuple versioning
  • MySQL — Redo log, Undo log
  • Redis — AOF (Append-Only File) คือหลักการคล้าย WAL
  • Database Internals — Buffer Pool dirty pages ต้องมี WAL ก่อน flush