pg_receivewal — 從 PostgreSQL 伺服器流式傳輸預寫日誌
pg_receivewal
[選項
...]
pg_receivewal 用於從正在執行的 PostgreSQL 叢集流式傳輸預寫日誌 (WAL)。預寫日誌使用流複製協議進行流式傳輸,並寫入本地檔案目錄。該目錄可用作進行時間點恢復 (PITR) 的歸檔位置(參見 第 25.3 節)。
pg_receivewal 在伺服器生成預寫日誌時即時流式傳輸,而不會像 archive_command 和 archive_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 啟動時會計算預寫日誌流的起點。
首先,掃描寫入 WAL 段檔案的目錄,找到最新的已完成段檔案,並將下一個 WAL 段檔案的開頭作為起點。
如果無法使用前一種方法計算出起點,並且使用了複製槽,則會發出額外的 READ_REPLICATION_SLOT
命令來檢索該槽的 restart_lsn
作為起點。此選項僅在從 PostgreSQL 15 及更高版本流式傳輸預寫日誌時可用。
如果無法使用前一種方法計算出起點,則使用伺服器透過 IDENTIFY_SYSTEM
命令報告的最新 WAL flush 位置作為起點。
如果連線丟失,或者無法初步建立連線(非致命錯誤),pg_receivewal 將無限期地重試連線,並在可能的情況下儘快重新建立流式傳輸。要避免此行為,請使用 -n
引數。
在沒有致命錯誤的情況下,pg_receivewal 將一直執行,直到被 SIGINT(Ctrl+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=方法
[:詳情
]
啟用預寫日誌的壓縮。
壓縮方法可以設定為 gzip
、lz4
(如果 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 在被 SIGINT 或 SIGTERM 訊號終止時將以狀態 0 退出。(這是正常結束它的方式。因此它不是錯誤。)對於致命錯誤或其他訊號,退出狀態將為非零。
此實用程式與大多數其他 PostgreSQL 實用程式一樣,使用 libpq 支援的環境變數(參見 第 32.15 節)。
環境變數 PG_COLOR
指定是否在診斷訊息中使用顏色。可能的值為 always
、auto
和 never
。
當使用 pg_receivewal 而不是 archive_command 或 archive_library 作為主要的 WAL 備份方法時,強烈建議使用複製槽。否則,伺服器可以自由地回收或刪除預寫日誌檔案,因為它們尚未備份,因為它沒有從 archive_command、archive_library 或複製槽獲得任何資訊,關於 WAL 流的歸檔進度。但請注意,如果接收器跟不上 WAL 資料的獲取速度,複製槽會填滿伺服器的磁碟空間。
pg_receivewal 將保留接收到的 WAL 檔案上的組許可權,如果源叢集啟用了組許可權。
從 mydbserver
伺服器流式傳輸預寫日誌,並將其儲存在本地目錄 /usr/local/pgsql/archive
$
pg_receivewal -h mydbserver -D /usr/local/pgsql/archive
如果您在文件中發現任何不正確、不符合您對特定功能的實際經驗或需要進一步澄清的內容,請使用 此表單 報告文件問題。