跳轉至內容

PostgreSQL/WAL

來自華夏公益教科書,自由的教科書,來自自由的世界

WAL(預寫式日誌)檔案是 PostgreSQL 以二進位制格式儲存更改的資料值的檔案。它屬於附加資訊,因此相對於資料庫檔案中的資訊來說是冗餘的。WAL 檔案可以被理解為一種特定型別的“diff”檔案。

WAL 檔案用於

  • 在系統崩潰後重建資料庫的一致狀態
  • 使用 連續歸檔 技術進行備份和恢復
  • 複製

寫入 WAL 檔案非常快,因為它們總是以順序方式寫入。對於具有旋轉碟片和移動讀寫頭的傳統磁碟來說尤其如此。與 WAL 檔案不同,資料庫檔案組織成樹狀結構,在寫入操作期間可能需要重新組織,或者包含指向其他塊的指標,這些指標位於遠離的位置。因此,寫入資料庫檔案的速度要慢得多。

出於效能原因,當客戶端請求寫入操作(如 UPDATEDELETE)時,對資料的修改將按特定順序進行,並且在某些部分是非同步的,與客戶端請求無關。首先,資料被寫入並重新整理到 WAL 檔案中。其次,資料被儲存在 RAM 中的共享緩衝區中。最後,它從共享緩衝區寫入到資料庫檔案。客戶端不會等待所有操作完成。在執行了前兩個非常快的操作之後,客戶端會收到請求已完成的通知。第三個操作是在稍後(或先前)的某個時間點非同步執行的。

WAL 檔案收集在 pg_wal 目錄中(在 PostgreSQL 10 之前的版本中為 pg_xlog)。根據資料庫的寫入活動,所有 WAL 檔案的總大小可能會急劇增加。因此,系統必須在這些檔案不再需要時將其刪除。在共享緩衝區中的更改(與 WAL 檔案的內容相對應)被重新整理到資料庫檔案後,WAL 檔案便可供刪除。由於在 CHECKPOINT 完成後可以保證該條件滿足,因此在 WAL 檔案刪除操作和 CHECKPOINT 之間存在一些依賴關係。

  • 您可以定義所有檔案在該目錄中的總大小限制:max_wal_size。如果達到該限制,PostgreSQL 將執行自動 CHECKPOINT 操作。
  • 您可以定義一個 checkpoint_timeout,以秒為單位。不晚於此秒數,PostgreSQL 將執行自動 CHECKPOINT 操作。

在這兩種情況下,共享緩衝區都會寫入磁碟,一個檢查點記錄被寫入當前的 WAL 檔案,所有舊的 WAL 檔案都可以被刪除。

其他條件可能會阻止 WAL 檔案的刪除,特別是歸檔命令失敗。max_wal_size 是一個軟限制,在這些情況下,系統可能會默默地超出該限制。


華夏公益教科書