2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10

pg_receivewal

pg_receivewal — 從 PostgreSQL 伺服器流式傳輸預寫日誌

概要

pg_receivewal [選項...]

描述

pg_receivewal 用於從正在執行的 PostgreSQL 叢集流式傳輸預寫日誌 (WAL)。預寫日誌使用流複製協議進行流式傳輸,並寫入本地檔案目錄。該目錄可用作進行時間點恢復 (PITR) 的歸檔位置(參見 第 25.3 節)。

pg_receivewal 在伺服器生成預寫日誌時即時流式傳輸,而不會像 archive_commandarchive_library 那樣等待段完成。因此,在使用 pg_receivewal 時,無需設定 archive_timeout

與 PostgreSQL 備用伺服器的 WAL 接收器不同,pg_receivewal 預設只在 WAL 檔案關閉時重新整理 WAL 資料。必須指定 --synchronous 選項才能即時重新整理 WAL 資料。由於 pg_receivewal 不應用 WAL,因此不應允許它成為同步備用伺服器,當 synchronous_commit 等於 remote_apply 時。如果這樣做,它將表現為永遠趕不上的備用伺服器,並導致事務提交阻塞。為避免這種情況,您應該為 synchronous_standby_names 配置合適的值,或者為 pg_receivewal 指定一個不匹配的 application_name,或者將 synchronous_commit 的值更改為 remote_apply 以外的其他值。

預寫日誌透過常規 PostgreSQL 連線進行流式傳輸,並使用複製協議。連線必須使用具有 REPLICATION 許可權的使用者(參見 第 21.2 節)或超級使用者進行,並且 pg_hba.conf 必須允許複製連線。伺服器還必須配置 max_wal_senders 設定得足夠高,以便為流至少留有一個可用會話。

pg_receivewal 啟動時會計算預寫日誌流的起點。

  1. 首先,掃描寫入 WAL 段檔案的目錄,找到最新的已完成段檔案,並將下一個 WAL 段檔案的開頭作為起點。

  2. 如果無法使用前一種方法計算出起點,並且使用了複製槽,則會發出額外的 READ_REPLICATION_SLOT 命令來檢索該槽的 restart_lsn 作為起點。此選項僅在從 PostgreSQL 15 及更高版本流式傳輸預寫日誌時可用。

  3. 如果無法使用前一種方法計算出起點,則使用伺服器透過 IDENTIFY_SYSTEM 命令報告的最新 WAL flush 位置作為起點。

如果連線丟失,或者無法初步建立連線(非致命錯誤),pg_receivewal 將無限期地重試連線,並在可能的情況下儘快重新建立流式傳輸。要避免此行為,請使用 -n 引數。

在沒有致命錯誤的情況下,pg_receivewal 將一直執行,直到被 SIGINTCtrl+C)或 SIGTERM 訊號終止。

選項

-D 目錄
--directory=目錄

輸出要寫入的目錄。

此引數是必需的。

-E lsn
--endpos=lsn

當接收達到指定的 LSN 時,自動停止複製並以正常退出狀態 0 退出。

如果存在 LSN 正好等於 lsn 的記錄,則該記錄將被處理。

--if-not-exists

指定 --create-slot 時,如果具有指定名稱的槽已存在,則不報錯。

-n
--no-loop

不要在連線錯誤時迴圈。而是立即以錯誤退出。

--no-sync

此選項會導致 pg_receivewal 不強制將 WAL 資料重新整理到磁碟。這速度更快,但意味著後續的作業系統崩潰可能會導致 WAL 段損壞。通常,此選項對於測試很有用,但在生產部署中進行 WAL 歸檔時不應使用。

此選項與 --synchronous 不相容。

-s 間隔
--status-interval=間隔

指定傳送回伺服器的狀態資料包之間的時間(秒)。這使得從伺服器更容易監控進度。值為零會完全停用週期性狀態更新,儘管在伺服器請求時仍會發送更新,以避免超時斷開連線。預設值為 10 秒。

-S 槽名
--slot=槽名

要求 pg_receivewal 使用現有的複製槽(參見 第 26.2.6 節)。使用此選項時,pg_receivewal 會向伺服器報告重新整理位置,指示每個段何時已同步到磁碟,以便伺服器可以刪除該段(如果不需要)。

當伺服器上配置的 pg_receivewal 複製客戶端是同步備用伺服器時,使用複製槽會向伺服器報告重新整理位置,但僅在 WAL 檔案關閉時。因此,該配置將導致主伺服器上的事務等待很長時間,並實際上無法正常工作。必須額外指定 --synchronous 選項(見下文)才能使其正常工作。

--synchronous

在接收到 WAL 資料後立即將其重新整理到磁碟。此外,在重新整理後立即向伺服器傳送狀態資料包,無論 --status-interval 設定如何。

如果伺服器上配置了 pg_receivewal 複製客戶端作為同步備用伺服器,則應指定此選項,以確保及時向伺服器傳送反饋。

-v
--verbose

啟用詳細模式。

-Z 級別
-Z 方法[:詳情]
--compress=級別
--compress=方法[:詳情]

啟用預寫日誌的壓縮。

壓縮方法可以設定為 gziplz4(如果 PostgreSQL 是使用 --with-lz4 編譯的)或 none(不壓縮)。可以選擇指定壓縮詳情字串。如果詳情字串是整數,則指定壓縮級別。否則,它應該是逗號分隔的項列表,每個項的形式為 關鍵字關鍵字=值。目前,唯一支援的關鍵字是 level

如果未指定壓縮級別,則使用預設壓縮級別。如果僅指定了級別而未提及演算法,則在級別大於 0 時使用 gzip 壓縮,在級別為 0 時不使用壓縮。

使用 gzip 時,檔名字尾 .gz 會自動新增到所有檔名中,使用 lz4 時,會新增字尾 .lz4

以下命令列選項控制資料庫連線引數。

-d connstr
--dbname=connstr

指定用於連線伺服器的引數,作為連線字串;這些將覆蓋任何衝突的命令列選項。

此選項名為 --dbname,以與其他客戶端應用程式保持一致。但由於 pg_receivewal 不連線到叢集中的任何特定資料庫,因此連線字串中包含的任何資料庫名稱都將被伺服器忽略。但是,這樣提供的資料庫名稱將覆蓋預設資料庫名稱(replication),以便在 ~/.pgpass 中查詢複製連線的密碼。同樣,用於連線 PostgreSQL 的中介軟體或代理可能會為此名稱用於連線路由等目的。

-h 主機
--host=主機

指定伺服器執行所在計算機的主機名。如果值以斜槓開頭,則將其用作 Unix 域套接字的目錄。預設值取自 PGHOST 環境變數(如果已設定),否則嘗試 Unix 域套接字連線。

-p
--port=

指定伺服器正在監聽連線的 TCP 埠或本地 Unix 域套接字副檔名。預設值為 PGPORT 環境變數(如果已設定),或者編譯時預設值。

-U 使用者名稱
--username=使用者名稱

要連線的使用者。:

-w
--no-password

絕不發出密碼提示。如果伺服器需要密碼身份驗證且密碼不可用(例如透過 .pgpass 檔案),則連線嘗試將失敗。此選項在沒有使用者在場輸入密碼的批處理作業和指令碼中很有用。

-W
--password

強制 pg_receivewal 在連線到資料庫之前提示輸入密碼。

此選項永遠不是必需的,因為如果伺服器要求密碼身份驗證,pg_receivewal 會自動提示輸入密碼。但是,pg_receivewal 會浪費一次連線嘗試來發現伺服器需要密碼。在某些情況下,鍵入 -W 以避免額外的連線嘗試是值得的。

pg_receivewal 可以執行以下兩項操作之一,以控制物理複製槽:

--create-slot

建立一個新的物理複製槽,名稱在 --slot 中指定,然後退出。

--drop-slot

刪除名稱在 --slot 中指定的複製槽,然後退出。

還提供其他選項

-V
--version

列印 pg_receivewal 版本並退出。

-?
--help

顯示有關 pg_receivewal 命令列引數的幫助,然後退出。

退出狀態

pg_receivewal 在被 SIGINTSIGTERM 訊號終止時將以狀態 0 退出。(這是正常結束它的方式。因此它不是錯誤。)對於致命錯誤或其他訊號,退出狀態將為非零。

環境變數

此實用程式與大多數其他 PostgreSQL 實用程式一樣,使用 libpq 支援的環境變數(參見 第 32.15 節)。

環境變數 PG_COLOR 指定是否在診斷訊息中使用顏色。可能的值為 alwaysautonever

註釋

當使用 pg_receivewal 而不是 archive_commandarchive_library 作為主要的 WAL 備份方法時,強烈建議使用複製槽。否則,伺服器可以自由地回收或刪除預寫日誌檔案,因為它們尚未備份,因為它沒有從 archive_commandarchive_library 或複製槽獲得任何資訊,關於 WAL 流的歸檔進度。但請注意,如果接收器跟不上 WAL 資料的獲取速度,複製槽會填滿伺服器的磁碟空間。

pg_receivewal 將保留接收到的 WAL 檔案上的組許可權,如果源叢集啟用了組許可權。

示例

mydbserver 伺服器流式傳輸預寫日誌,並將其儲存在本地目錄 /usr/local/pgsql/archive

$ pg_receivewal -h mydbserver -D /usr/local/pgsql/archive

另請參閱

pg_basebackup

提交更正

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