PostgreSQL WAL機制深度解析與優化

PostgreSQL 的預寫日志(Write-Ahead Logging, WAL) 是其事務持久化和數據完整性的核心機制,通過“先寫日志,再寫數據”的原則保障故障恢復能力。以下是深度解析:


一、WAL 的核心目標

  1. 崩潰恢復(Crash Recovery)
    • 數據庫意外崩潰(如斷電)時,通過重放 WAL 日志將數據恢復到一致狀態。
  2. 事務持久性(Durability)
    • 已提交的事務數據絕不丟失(符合 ACID 的 D 特性)。
  3. 物理復制基礎
    • WAL 日志流是主從流復制(Streaming Replication)的底層支持。

二、WAL 工作原理

關鍵流程
事務提交
寫入 WAL Buffer
WAL Buffer 刷盤
數據寫入 Shared Buffer
Checkpoint 刷臟頁
  1. 提交事務時
    • 先將事務修改生成 WAL 記錄(描述數據變化的邏輯)寫入內存中的 WAL Buffer
  2. 日志刷盤(關鍵步驟)
    • 調用 fsync() 將 WAL Buffer 強制刷入磁盤的 WAL 文件(通常位于 pg_wal 目錄),確保日志持久化。
  3. 數據寫入
    • 事務提交成功后,實際數據才異步寫入內存的 Shared Buffer Pool
  4. 臟頁刷盤
    • 后臺進程 Checkpointer 定期將 Shared Buffer 中的臟頁寫入數據文件。

?? 關鍵點:數據寫入磁盤前,其變更日志必須已落盤。即使崩潰丟失內存數據,也能通過 WAL 重放恢復。


三、WAL 日志結構

物理組成
組件描述
WAL 段文件默認 16MB 的二進制文件(如 0000000100000001000000A1),循環覆蓋寫入
WAL Record最小單元,包含:事務 ID、修改的頁面、舊值/新值等元數據
LSN (Log Sequence Number)日志位置標識(如 1/7103E828),用于追蹤復制和恢復進度

四、WAL 在恢復中的作用

  1. 崩潰后重啟
    • PostgreSQL 讀取最新檢查點(Checkpoint),重放此后所有 WAL 記錄:
      • REDO:重做已提交事務(防止數據丟失)。
      • UNDO:回滾未提交事務(保證一致性)。
  2. 時間點恢復(PITR)
    • 基于基礎備份 + 增量 WAL 日志,恢復到任意時間點(需啟用歸檔模式)。

五、WAL 相關配置優化

-- 重要參數(postgresql.conf):
wal_level = replica          -- 日志級別(minimal/replica/logical)
fsync = on                   -- 強制日志刷盤(禁用可提性能但危險!)
wal_buffers = 16MB           -- WAL 緩沖區大小(默認 -1 即 1/32 shared_buffers)
checkpoint_timeout = 5min    -- Checkpoint 最大間隔
max_wal_size = 1GB           -- WAL 最大占用空間(觸發檢查點)
性能權衡建議
場景優化方向
高寫入負載增大 wal_buffers + 合理延長 checkpoint_timeout(減少 I/O 峰值)
數據安全性優先確保 fsync=on + full_page_writes=on(防止部分寫入導致崩潰后頁面損壞)
備份恢復靈活性設置 wal_level=replica + 啟用 WAL 歸檔(archive_mode=on

六、WAL 與復制的關系

  • 物理復制(流復制)
    備庫持續接收主庫的 WAL 流,重放日志實現數據同步(同步/異步模式)。
  • 邏輯復制
    解析 WAL 為邏輯變更(需 wal_level=logical),跨版本或異構數據庫同步。

七、監控與維護

-- 查看 WAL 狀態
SELECT pg_current_wal_lsn();          -- 當前 LSN 位置
SELECT pg_walfile_name('1/7103E828'); -- LSN 對應的 WAL 文件名-- 歸檔監控
SELECT * FROM pg_stat_archiver;       -- WAL 歸檔統計信息
關鍵運維命令
# 手動切換 WAL 文件
psql -c "SELECT pg_switch_wal();"# 清理舊 WAL 文件(謹慎!需確保無復制/歸檔依賴)
pg_controldata $PGDATA | grep "Latest checkpoint"

總結:WAL 的核心價值

  • 數據安全的基石:確保已提交事務永不丟失。
  • 高性能的權衡:用順序寫日志代替隨機寫數據,提升并發能力。
  • 生態擴展核心:支撐物理復制、邏輯復制、PITR 等高級功能。

💡 最佳實踐:生產環境務必啟用 WAL 歸檔 + 定期基礎備份,構建完整的災備體系。對于云數據庫(如 RDS/Aurora),其高可用能力本質也是基于 WAL 的深度封裝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920679.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三重積分的性質

文章目錄前言幾何意義性質先 1 后 2 投影法先 2 后 110.13前言 規律作息。 幾何意義 三重積分,只要被積分函數是正的,那么,積分的結果就是質量。可能工作還是太累了,以后有時間可以買買彩票,碰碰運氣。。。。 性質…

每日Java并發面試系列(5):基礎篇(線程池的核心原理是什么、線程池大小設置為多少更合適、線程池哪幾種類型?ThreadLocal為什么會導致內存泄漏?)

1. 什么是線程池?它的核心原理是什么?什么是線程池? 線程池是一種基于池化思想管理和使用線程的機制。它內部維護了多個線程,等待著分配由用戶提交的并發執行的任務。這避免了頻繁創建和銷毀線程帶來的開銷,從而提高了…

京東商品詳情API返回值應用實踐

一、API核心功能京東商品詳情API(如jd.item.get或jd.union.open.goods.query)是京東開放平臺提供的核心接口,用于通過商品ID(skuId)或店鋪ID檢索指定商品的詳細信息。該接口支持獲取商品基礎信息、價格、庫存、規格參數…

學習python第14天

匯報一下秋招進度,字節一面完后9天都沒給回復,大概率被掛了,但是官網還在流程中,我又沒有HR聯系方式,所以直接在平臺上反饋了,要么趕緊給我過,要么趕緊給我掛,耽誤時間。阿里國際一面…

監聽nacos配置中心數據的變化

RefreshScope實現nacos配置中心數據的動態刷新。如果需要監聽nacos配置中心數據的變化&#xff0c;并執行對應的業務邏輯&#xff0c;則可以使用NacosConfigListener注解。除了需要導入微服務和nacos配置中心的jar&#xff0c;還需要額外導入如下的jar&#xff1a;<dependen…

docker搭建Apisix和Apisix Dashboard

第一步&#xff1a;github下載源碼 參考&#xff1a;https://apisix.apache.org/zh/docs/apisix/installation-guide/ git clone https://github.com/apache/apisix-docker.git cd apisix-docker/example第二步&#xff1a;添加Apisix Dashboard鏡像 打開./apisix-docker/examp…

ubuntu 安裝conda, ubuntu24安裝miniConda

1. 官網下載腳本&#xff1a; Download Success | Anaconda 我選的mini版本&#xff0c;也可以選左邊的完整版 2. 下載后&#xff0c;上傳至服務器/opt下 3. 執行腳本安裝&#xff1a; sh Miniconda3-latest-Linux-x86_64.sh 4. 需要按照英文提示&#xff0c;輸入回車&#…

現代貪吃蛇游戲的進化:從經典玩法到多人在線體驗

Hi&#xff0c;我是前端人類學&#xff08;之前叫布蘭妮甜&#xff09;&#xff01; 貪吃蛇游戲自1976年誕生以來&#xff0c;已經從簡單的像素游戲發展成為具有豐富功能的現代游戲體驗。本文將通過一個功能增強版的貪吃蛇游戲&#xff0c;探討如何將經典游戲概念與現代Web技術…

加速智能經濟發展:如何助力“人工智能+”戰略在實時視頻領域的落地

2025年8月&#xff0c;國務院發布了《關于深入實施“人工智能”行動的意見》&#xff08;國發〔2025〕11號&#xff09;&#xff0c;明確提出&#xff0c;到2030年&#xff0c;我國將在人工智能技術的推動下全面邁入智能經濟與智能社會的新階段。政策強調&#xff0c;要通過推動…

從 WPF 到 Avalonia 的遷移系列實戰篇1:依賴屬性的異同點與遷移技巧

從 WPF 到 Avalonia 系列實戰篇1&#xff1a;依賴屬性的異同與實踐&#xff08;基于 BlinkingButton 控件&#xff09; 我的GitHub倉庫Avalonia學習項目包含完整的Avalonia實踐案例與代碼對比。 我的gitcode倉庫是Avalonia學習項目。 文中主要示例代碼均可在倉庫中查看&#xf…

基于開源AI大模型AI智能名片S2B2C商城小程序的產地優勢產品銷售策略研究

摘要&#xff1a;本文聚焦于在開源AI大模型AI智能名片S2B2C商城小程序的商業生態中&#xff0c;探討如何利用產地優勢進行產品銷售。通過分析不同產品類別的產地優勢&#xff0c;如阿膠類選東阿、海參類選沿海、紅酒類選海外等&#xff0c;結合開源AI大模型的技術支持、AI智能名…

大數據畢業設計選題:基于大數據的用戶貸款行為數據分析系統Spark SQL核心技術

&#x1f34a;作者&#xff1a;計算機畢設匠心工作室 &#x1f34a;簡介&#xff1a;畢業后就一直專業從事計算機軟件程序開發&#xff0c;至今也有8年工作經驗。擅長Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等。 擅長&#xff1a;按照需求定制化開發項目…

阻塞,非阻塞,同步,異步的理解

典型的IO分為兩個階段&#xff1a;數據的準備&#xff1a;根據系統IO操作的就緒狀態&#xff0c;阻塞&#xff0c;非阻塞&#xff08;從外部向內核緩沖區拷貝數據&#xff0c;應用進程的狀態 內核緩沖區上是否有數據可讀&#xff0c;數據沒有準備好&#xff0c;應用調用recv阻塞…

uniapp監聽物理返回按鈕事件

1. uniapp監聽物理返回按鈕事件uniapp 監聽頁面返回功能有使用onBackPress方法和使用onUnload方法。 1.1. 使用onBackPress方法在uniapp中&#xff0c;可以使用onBackPress方法來監聽頁面返回事件。這個方法與onLoad等生命周期方法同級&#xff0c;可以監聽左上角返回按鈕或and…

Windows server 2012安裝步驟

單機文件&#xff0c;選擇新建虛擬機如果分配太少的話會影響后續系統使用的流暢度&#xff0c;但是后續都是可以更改的這里選擇第一個即可選擇自定義安裝&#xff0c;然后點擊下一步即可然后點擊下一步&#xff0c;這里要等一段時間大小寫加數字組合,記錄一下密碼避免后面使用的…

【開題答辯全過程】以 “與我同行”中華傳統歷史數字化平臺的設計和分析-------為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

Fortran二維數組去重(unique)算法實戰

Fortran: 去重unique算法實現對二維數組的快速去重 1 引言 2 結語 1 引言 本篇介紹去重算法unique,目的是為了保留數組中的唯一值。算法原理:首先將二維數組的每一行轉換成一個整數,然后對新構成的一維數組進行排序去重,最終得到正反索引。本程序與Matlab的Unique函數進行過…

小迪安全v2023學習筆記(七十四講)—— 驗證機制篇驗證碼繞過思路SRC挖掘演示

文章目錄前記WEB攻防——第七十四天機制驗證篇&重定向發送&響應狀態碼&跳過步驟&驗證碼回傳&枚舉驗證碼突破 - 回傳顯示&規律爆破漏洞原理案例演示回傳顯示規律爆破驗證目標 - 重定向發送&重定向用戶漏洞原理案例演示重定向發送重定向用戶驗證邏輯…

福彩雙色球第2025100期籃球號碼分析

福彩雙色球第20250100期籃球號碼分析&#xff0c;上期開出數字14&#xff0c;數字形式是2路球&#xff0c;合數偶數&#xff0c;大號區域數字&#xff01;最近十幾期籃球明顯大號區域得數字比較多&#xff0c;本期直接排除大號區域數字10-11-12-13-14-15-16。最近十幾期籃球出合…

【74LS112JK觸發器三進制】2022-10-8

緣由雙jk觸發器的工作原理是什么-其他-CSDN問答 JK觸發器和觸發器中最基本的RS觸發器結構相似&#xff0c;其區別在于&#xff0c;RS觸發器不允許R與S同時為1&#xff0c;而JK觸發器允許J與K同時為1。當J與K同時變為1的同時&#xff0c;輸出的值狀態會反轉。也就是說&#xff…