2025年9月25日: PostgreSQL 18 釋出!
支援版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不再支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1

28.3. 預寫日誌 (WAL) #

預寫日誌 (WAL) 是一種確保資料完整性的標準方法。在大多數(如果不是全部)關於事務處理的書籍中都可以找到詳細描述。簡而言之,WAL的核心概念是,對資料檔案(表和索引所在的儲存位置)的更改必須在這些更改被記錄下來之後才能寫入,也就是說,在描述更改的 WAL 記錄已重新整理到永久儲存之後才能寫入。如果我們遵循這個過程,就不需要在每次事務提交時將資料頁重新整理到磁碟,因為我們知道,萬一發生崩潰,我們能夠使用日誌恢復資料庫:任何尚未應用於資料頁的更改都可以從 WAL 記錄中重做。(這就是前滾恢復,也稱為 REDO。)

提示

因為WAL在崩潰後可以恢復資料庫檔案內容,所以不需要日誌檔案系統來實現資料檔案或 WAL 檔案的可靠儲存。事實上,日誌的開銷會降低效能,尤其是當日志導致檔案系統 資料 被重新整理到磁碟時。幸運的是,日誌過程中的資料重新整理通常可以透過檔案系統掛載選項來停用,例如,在 Linux ext3 檔案系統上使用 data=writeback。日誌檔案系統確實可以加快崩潰後的啟動速度。

使用WAL可以顯著減少磁碟寫入次數,因為只需要將 WAL 檔案重新整理到磁碟即可保證事務已提交,而不是將事務更改的每個資料檔案都重新整理。WAL 檔案是順序寫入的,因此同步 WAL 的成本遠低於重新整理資料頁的成本。對於處理許多接觸資料儲存不同部分的小型事務的伺服器來說,這一點尤其如此。此外,當伺服器處理許多併發的小型事務時,一次對 WAL 檔案的 fsync 就足以提交許多事務。

WAL還使得支援線上備份和時間點恢復成為可能,如 第 25.3 節中所述。透過歸檔 WAL 資料,我們可以支援回滾到可用 WAL 資料所覆蓋的任何時間點:我們只需安裝資料庫的先前物理備份,然後重放 WAL 直到所需時間。更重要的是,物理備份不必是資料庫狀態的瞬時快照 — 如果它是經過一段時間建立的,那麼重放該時間段的 WAL 將修復任何內部不一致。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。