| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
預寫式日志 (WAL) 是一種實現事務日志的標準方法。有關它的詳細描述可以在大多數(如果不是全部的話)有關事務處理的書中找到。 簡而言之,WAL 的中心思想是對數據文件的修改(它們是表和索引的載體)必須是只能發生在這些修改已經記錄了日志之後, 也就是說,在日志記錄衝刷到永久存儲器之後。 如果我們遵循這個過程,那麼我們就不需要在每次事務提交的時候都把數據頁衝刷到磁盤,因為我們知道在出現崩潰的情況下, 我們可以用日志來恢復數據庫: 任何尚未附加到數據頁的記錄都將先從日志記錄中重做(這叫向前滾動恢復,也叫做 REDO)然後那些未提交的事務做的修改將被從數據頁中刪除(這叫向後滾動恢復,UNDO)。
使用 WAL 的第一個明顯的好處就是顯著地減少了磁盤寫的次數。 因為在日志提交的時候只有日志文件需要衝刷到磁盤; 在多用戶環境裡,許多事務的提交可以用日志文件的一次 fsync() 來完成。而且,日志文件是順序寫的, 因此同步日志的開銷要遠比同步數據頁的開銷要小。
另外一個好處就是數據頁的完整性。實際情況是,在 WAL 之前,PostgreSQL 從來不能保證在崩潰的情況下數據頁的完整性。 在 WAL 之前,在寫的過程中的任何崩潰都可能導致:
索引記錄指向一個不存在的表的行
索引記錄在分裂操作中丟失
完全崩潰了的表和索引頁的內容,因為數據頁只寫了一部分
索引的問題(問題 1 和 2)可能已經通過額外的 fsync() 調用修補好了,但是如果沒有 WAL,那麼沒有很明顯的處理第三種情況的方法; WAL 在日志裡保存整個數據頁的內容 -- 如果那些內容在崩潰後的恢復中需要確保數據頁的完整性的話。