pg_receivewal — 從 PostgreSQL 伺服器串流預寫式日誌
pg_receivewal
[選項
...]
pg_receivewal 用於從正在執行的 PostgreSQL 叢集串流預寫式日誌。預寫式日誌使用串流複製協定進行串流,並寫入本機目錄中的檔案。此目錄可用作使用時間點回復執行還原的封存位置(請參閱第 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 刷新位置。
如果連線中斷,或者如果無法使用非致命錯誤建立連線,pg_receivewal 將無限期地重試連線,並儘快重新建立串流。為了避免這種行為,請使用 -n
參數。
在沒有致命錯誤的情況下,pg_receivewal 將執行直到被 SIGINT(Control+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 level
-Z method
[:detail
]
--compress=level
--compress=method
[:detail
]
啟用預寫式日誌的壓縮。
壓縮方法可以設定為 gzip
、lz4
(如果 PostgreSQL 是使用 --with-lz4
編譯的)或 none
(表示不壓縮)。可以選擇性地指定壓縮詳細字串。如果詳細字串是整數,則它指定壓縮等級。否則,它應該是以逗號分隔的項目清單,每個項目的格式為 keyword
或 keyword=value
。目前,唯一支援的關鍵字是 level
。
如果未指定壓縮等級,將使用預設壓縮等級。如果僅指定等級而未提及演算法,則如果等級大於 0,將使用 gzip
壓縮,如果等級為 0,則不使用壓縮。
使用 gzip
時,後綴 .gz
將自動新增到所有檔案名稱,而使用 lz4
時,則新增後綴 .lz4
。
以下命令列選項控制資料庫連線參數。
-d connstr
--dbname=connstr
指定用於連線到伺服器的參數,作為連線字串;這些參數將覆蓋任何衝突的命令列選項。
為了與其他用戶端應用程式保持一致,此選項稱為 --dbname
,但由於 pg_receivewal 不會連線到叢集中的任何特定資料庫,因此伺服器會忽略連線字串中包含的任何資料庫名稱。但是,以這種方式提供的資料庫名稱會覆蓋預設資料庫名稱 (replication
),以便在 ~/.pgpass
中查詢複製連線的密碼。同樣,用於連線到 PostgreSQL 的中介軟體或代理程式可能會利用該名稱來達到諸如連線路由等目的。
-h host
--host=host
指定伺服器執行的機器的主機名稱。如果該值以斜線開頭,則將其用作 Unix 網域通訊端的目錄。預設值取自 PGHOST
環境變數(如果已設定),否則將嘗試 Unix 網域通訊端連線。
-p port
--port=port
指定伺服器正在監聽連線的 TCP 埠或本機 Unix 網域通訊端檔案副檔名。預設為 PGPORT
環境變數(如果已設定)或編譯時預設值。
-U username
--username=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
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符,或需要進一步澄清之處,請使用此表單回報文件問題。