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
| ด้าน | PostgreSQL | MySQL InnoDB |
|---|---|---|
| WAL/Redo | WAL | Redo Log (สิ่งเดียวกัน) |
| Undo | ไม่ใช้ undo log แบบดั้งเดิม | ใช้ undo log เก็บ old version |
| MVCC | Tuple versioning ใน heap | Undo log เก็บ old version แยก |
| Rollback | เร็วมาก (แค่ mark abort) | ต้อง apply undo log |
| ข้อเสีย | Heap bloat → ต้อง VACUUM | Undo 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)
Related
- 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