PostgreSQL restartpoint 原理詳解

背景

大部分人對 PG 的 checkpoint 機制會熟悉一點,但是對 restartpoint 卻不太熟悉,網上介紹這方面的文章也比較少。因此,本文將以 PG 14.7 的社區代碼為基礎,介紹 PG 中的 restartpoint 機制。

原理介紹

什么是 restartpoint

在了解 restartpoint 前,首先需要知道 checkpoint,可以參考這篇博文 https://blog.csdn.net/zxwsbg/article/details/115013885?spm=1001.2014.3001.5502

簡單的介紹如下所示

  • checkpoint: 主庫用的,用來定期刷臟及其他一些功能,crash 后實例自動去找最新的一個 checkpoint ,從其中記錄的 redo point 的 WAL 日志位點開始向后進行 redo;
  • restartpoint:備庫用的,和主庫的 checkpoint 功能類似,備庫的 checkpointer 進程會定期的做 restartpoint 進行刷臟,并記錄一些位點,如果 crash 了直接從對應的位點開始向后進行 redo。

restartpoint 觸發機制

有兩種觸發機制:

  1. 當距離做上一個 restartpoint 已經過去了 checkpoint_timeout 秒,并且主庫又做了新的 checkpoint ,這時觸發 restartpoint;
  2. 備機 WAL 大小快要超過 max_wal_size 參數設定的值;

restartpoint 做了什么

checkpoint XLOG 重做

在上一節的觸發機制 1 中,主庫做了一個 checkpoint(非關機時的 checkpoint ),會寫一條 XLOG_CHECKPOINT_ONLINE 類型日志。
備機的 startup 進程在 xlog_redo 函數中,會針對這種類型日志做日志回放,并在 RecoveryRestartPoint 函數中保存主庫該 checkpoint 的相關位點信息——checkpoint 位點、redo point 位點等。
在這里插入圖片描述

CreateRestartPoint 函數

如上文所述,備機的 checkpointer 進程會定期觸發 CreateRestartPoint 函數。該函數主要做了以下內容:

  1. 使用最近一次 checkpoint WAL 中的 redopoint 位點、chckpoint WAL 位點更新自身的對應位點;
  2. 使用 CheckPointGuts 進行刷臟,將內存中的信息持久化到硬盤;
  3. 更新 pg_controlfile 中的信息,并落盤;
  4. 進行 WAL 日志文件回收;
  5. 寫 CSV 日志記錄本次 restartpoint(如果設置了的話),更新進程的相關顯示信息。

需要注意的是:restartpoint 不寫 WAL

參考資料

[1] https://www.postgresql.org/docs/current/wal-configuration.html

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

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

相關文章

華為OD技術面試案例1-2024年

背景: 學校背景:211本科工作經驗:1年半轉行目標:測試崗位 一、機考 (得分:350) 二、01.04 hr面 自我介紹選擇東莞的原因對OD(華為研發崗位)的看法家庭情況簡歷相關問…

信息論筆記:信息量+熵+相對熵+交叉熵+損失函數

信息論 信息量 I(x) -log( P )I為信息量P為x發生的概率 熵 混亂程度的度量,不確定的局面表示很混亂系統里信息量的期望值H(x) -sum( P(i) * log( P(i) ) ) 相對熵(KL散度) 用于度量兩個概率分布間的差異性信息D_KL(S | O) sum( P_S(x) * log_2( 1 / P_O(x)…

Mysql學習之各種鎖

鎖 事務的隔離性由鎖來實現 MySQL并發事務訪問相同記錄 并發事務訪問相同記錄的情況大致可以分為3種: 讀-讀的情況 讀-讀情況,即并發事務相繼讀取相同的記錄。讀取操作本身不會對記錄由有任何的影響,并不會引起什么問題,所以允許…

簡要講解OV7725攝像頭

本文主要包含以下幾部分內容: 1. 通過OV7725分析模塊原理圖。 2. 講解部分寄存器的含義、RGB565格式圖像輸出時序、幀率計算。 3. 講解SCCB協議與I2C協議的區別。 1、OV7725功能 OV7725是一款1/4英寸單芯片圖像傳感器,其感光陣列達到640*480&#xff0c…

LibreOJ 137. 最小瓶頸路(加強版) 題解 Kruscal重構樹 ST表

聲明:本題目是LibreOJ 136. 最小瓶頸路 題解 最小生成樹 倍增加強版,建議先學習簡單版的做法。 題目鏈接:LibreOJ 137. 最小瓶頸路(加強版) 題目描述: 給定一張無向圖,詢問兩個結點之間的最小瓶…

【MySQL 系列】在 Windows 上安裝 MySQL

在 Windows 平臺上安裝 MySQL 很簡單,并不需要太復雜的步驟。按照本文的步驟操練起來就可以了。 文章目錄 1、下載 MySQL 安裝程序2、安裝 MySQL 數據庫2.1、選擇安裝類型2.2、檢查所需組件2.3、安裝所選產品組件2.4、產品配置2.5、配置高可用性2.6、配置服務器類型…

【leetcode】 劍指 Offer學習計劃(java版本含注釋)(下)

目錄 前言第十六天(排序)劍指 Offer 45. 把數組排成最小的數(中等)劍指 Offer 61. 撲克牌中的順子(簡單) 第十七天(排序)劍指 Offer 40. 最小的k個數(簡單) 第…

c++11多線程:call_once

文章目錄 call_once示例一示例二 call_once std::call_once是 C11 標準庫中的一個函數,用于確保某個函數只會被調用一次。 單例設計模式是一種常見的設計模式,用于確保某個類只能創建一個實例。由于單例實例是全局唯一的,因此在多線程環境中…

YOLO系列中的“data.yaml”詳解!

專欄介紹:YOLOv9改進系列 | 包含深度學習最新創新,主力高效漲點!!! 一、data.yaml介紹 YOLO系列中的data.yaml文件包含了YOLO系列模型運行所需要的數據集路徑、數據集中的類別數及標簽。數據集路徑可以用絕對路徑也可以…

Python實現股票信息查詢

目前兩個常用的股票信息CPI: 騰訊行情CTPAPI接口源碼 新浪行情CTPAPI 使用requests模塊爬取股票信息,這里以查詢股票市值為例。 一、根據股票名稱查詢股票代碼 在python文件夾下設置兩個表格GPLIST.xlsx,其中是A股全部代碼和股票名稱&#…

如何在飛書接入ChatGPT并結合內網穿透實現公網遠程訪問智能AI助手

文章目錄 前言環境列表1.飛書設置2.克隆feishu-chatgpt項目3.配置config.yaml文件4.運行feishu-chatgpt項目5.安裝cpolar內網穿透6.固定公網地址7.機器人權限配置8.創建版本9.創建測試企業10. 機器人測試 前言 在飛書中創建chatGPT機器人并且對話,在下面操作步驟中…

MySQL 高可用解決方案(雙主雙從)

1.環境說明 操作系統:centos7.7 主服務器:node2(192.168.1.102) 從服務器:node3(192.168.1.103) keepalived中虛擬ip(VIP):192.168.1.100 2.準備事項 主庫和從庫數據庫的版本一致把主庫的數據同步給從庫一份 #對主庫進行全局讀鎖定 FLUSH…

GEE代碼條帶問題——sentinel-1接縫處理的問題

問題 我有興趣確定 NDVI 損失最大的年份。我創建了一個函數來收集所有陸地衛星圖像并應用預處理。當我導出結果以識別 NDVI 損失最大年份時,生成的數據產品與陸地衛星場景足跡有可怕的接縫線。造成這種情況的原因是什么以及如何調整代碼? sentinel1數據…

flutter之終極報錯

看到這個報錯頭都大了 一開始在網上各種搜搜,然后有人說是flutter版本的問題,改完版本之后還是不對,又是各種搜搜搜 有人說是環境變量的問題,后來改了環境變量,媽的,竟然還不行,想砸電腦的心都…

Xcode :Could not build module ‘WebKit‘ 已驗證解決

問題&#xff1a;Could not build module WebKit 具體報錯如下&#xff1a; error: type argument nw_proxy_config_t (aka struct nw_proxy_config *) is neither an Objective-C object nor a block type property (nullable, nonatomic, copy) NSArray<nw_proxy_config_…

C++學習筆記:set和map

set和map set什么是setset的使用 關聯式容器鍵值對 map什么是mapmap的使用map的插入方式常用功能map[] 的靈活使用 set 什么是set set是STL中一個底層為二叉搜索樹來實現的容器 若要使用set需要包含頭文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…

【java-面試題】start和run的區別

【java-面試題】start和run的區別 在run方法內部&#xff0c;只是單純的描述了該線程要執行的內容。run方法是線程的入口。 在start方法內部&#xff0c;會調用到系統api&#xff0c;從而在系統內核中創建出線程&#xff0c;創建線程后&#xff0c;再自動調用run方法。 在代碼…

掌握未來技術:一站式深度學習學習平臺體驗!

介紹&#xff1a;深度學習是機器學習的一個子領域&#xff0c;它模仿人腦的分析和學習能力&#xff0c;通過構建和訓練多層神經網絡來學習數據的內在規律和表示層次。 深度學習的核心在于能夠自動學習數據中的高層次特征&#xff0c;而無需人工進行復雜的特征工程。這種方法在圖…

大模型筆記:RAG(Retrieval Augmented Generation,檢索增強生成)

1 大模型知識更新的困境 大模型的知識更新是很困難的&#xff0c;主要原因在于&#xff1a; 訓練數據集固定,一旦訓練完成就很難再通過繼續訓練來更新其知識參數量巨大,隨時進行fine-tuning需要消耗大量的資源&#xff0c;并且需要相當長的時間LLM的知識是編碼在數百億個參數中…

格式規范性知識的探究式學習

對于格式規范性這種規定性的知識&#xff0c;可以采用“增刪改”的方式進行控究式學習。 #include<stdio.h>int main(){printf("%.1f\n", 8.0/5.0);return 0;} 這個printf語句分兩部分&#xff0c;本身的功能就是格式化輸出&#xff0c;因此參數完全是格式化…