支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5

pg_rewind

pg_rewind — 將 PostgreSQL 資料目錄與另一個由此分叉的資料目錄同步

概要

pg_rewind [option...] { -D | --target-pgdata } directory { --source-pgdata=directory | --source-server=connstr }

描述

pg_rewind 是一個工具,用於在叢集的時間線分歧後,將 PostgreSQL 叢集與同一個叢集的另一個副本同步。一個典型的場景是在容錯移轉後將舊的主伺服器重新上線,作為追蹤新主伺服器的備用伺服器。

成功倒轉後,目標資料目錄的狀態類似於來源資料目錄的基礎備份。與建立新的基礎備份或使用像 rsync 這樣的工具不同,pg_rewind 不需要比較或複製叢集中未變更的關聯區塊。只複製現有關聯檔案中變更的區塊;所有其他檔案,包括新的關聯檔案、組態檔案和 WAL 段,都會完整複製。因此,當資料庫很大且叢集之間只有一小部分區塊不同時,倒轉操作明顯快於其他方法。

pg_rewind 檢查來源和目標叢集的時間線歷程,以判斷它們分歧的點,並預期在目標叢集的 pg_wal 目錄中找到 WAL,一直追溯到分歧點。可以在目標時間線、來源時間線或它們的共同祖先上找到分歧點。在典型的容錯移轉場景中,目標叢集在分歧後很快關閉,這不是問題,但如果目標叢集在分歧後運行了很長時間,其舊的 WAL 檔案可能不再存在。在這種情況下,您可以手動將它們從 WAL 封存複製到 pg_wal 目錄,或使用 -c 選項運行 pg_rewind 以自動從 WAL 封存檢索它們。pg_rewind 的使用不限於容錯移轉,例如,可以提升備用伺服器,運行一些寫入交易,然後倒轉以再次成為備用伺服器。

運行 pg_rewind 後,WAL 重播需要完成,資料目錄才能處於一致的狀態。當目標伺服器再次啟動時,它將進入封存恢復,並重播來源伺服器中從分歧點之前的最後一個檢查點開始的所有 WAL。如果在運行 pg_rewind 時,來源伺服器中的某些 WAL 不再可用,因此 pg_rewind 會話無法複製,則必須在啟動目標伺服器時使其可用。這可以透過在目標資料目錄中建立一個 recovery.signal 檔案,並在 postgresql.conf 中組態一個合適的 restore_command 來完成。

pg_rewind 要求目標伺服器在 postgresql.conf 中啟用 wal_log_hints 選項,或者在使用 initdb 初始化叢集時啟用資料校驗和。目前預設情況下這兩者都未啟用。full_page_writes 也必須設定為 on,但預設情況下已啟用。

警告:倒轉時發生失敗

如果 pg_rewind 在處理過程中失敗,則目標的資料夾可能處於無法恢復的狀態。在這種情況下,建議建立一個新的乾淨備份。

由於 pg_rewind 將組態檔案完全從來源複製,因此可能需要在重新啟動目標伺服器之前更正用於恢復的組態,特別是如果目標作為來源的備用伺服器重新引入。如果在倒轉操作完成後但未組態恢復的情況下重新啟動伺服器,則目標可能會再次與主伺服器分歧。

如果 pg_rewind 發現無法直接寫入的檔案,它將立即失敗。例如,當來源和目標伺服器對唯讀 SSL 金鑰和憑證使用相同的文件對應時,可能會發生這種情況。如果目標伺服器上存在這些檔案,建議在運行 pg_rewind 之前將它們移除。在完成倒轉後,某些檔案可能已從來源複製,在這種情況下,可能需要移除複製的資料並恢復回倒轉之前使用的連結集。

選項

pg_rewind 接受下列命令列引數

-D directory
--target-pgdata=directory

此選項指定與來源同步的目標資料目錄。在運行 pg_rewind 之前,必須乾淨地關閉目標伺服器

--source-pgdata=directory

指定來源伺服器的資料目錄的檔案系統路徑,以同步目標。此選項要求來源伺服器乾淨地關閉。

--source-server=connstr

指定一個 libpq 連線字串,用來連線到來源 PostgreSQL 伺服器,以便與目標伺服器進行同步。此連線必須是一般的(非複製)連線,並且使用具有足夠權限的角色來執行 pg_rewind 在來源伺服器上使用的函式(詳細資訊請參閱「注意事項」章節),或是一個超級使用者角色。此選項需要來源伺服器正在執行中且接受連線。

-R
--write-recovery-conf

在輸出目錄中建立 standby.signal,並將連線設定附加到 postgresql.auto.conf。使用此選項時,--source-server 是強制性的。

-n
--dry-run

執行所有步驟,但不實際修改目標目錄。

-N
--no-sync

預設情況下,pg_rewind 會等待所有檔案安全地寫入到磁碟。此選項會導致 pg_rewind 不等待就返回,這樣速度更快,但意味著後續的作業系統崩潰可能會導致資料目錄損壞。通常,此選項適用於測試,但不應在生產環境中使用。

-P
--progress

啟用進度報告。啟用此功能將在從來源叢集複製資料時提供近似的進度報告。

-c
--restore-target-wal

如果 WAL 檔案不再位於 pg_wal 目錄中,則使用目標叢集配置中定義的 restore_command 從 WAL 封存中檢索 WAL 檔案。

--config-file=filename

對目標叢集使用指定的主伺服器設定檔。當 pg_rewind 在內部使用 postgres 命令對此叢集執行回溯操作時(當使用選項 -c/--restore-target-wal 檢索 restore_command 時,以及強制完成崩潰恢復時),此選項會產生影響。

--debug

印出詳細的偵錯輸出,這對於開發人員偵錯 pg_rewind 很有用。

--no-ensure-shutdown

pg_rewind 要求在回溯之前,目標伺服器必須乾淨地關閉。預設情況下,如果目標伺服器未乾淨地關閉,pg_rewind 會先在單使用者模式下啟動目標伺服器以完成崩潰恢復,然後將其停止。透過傳遞此選項,pg_rewind 會跳過此步驟,如果伺服器未乾淨地關閉,則會立即出錯。在這種情況下,使用者需要自行處理。

--sync-method=method

當設定為 fsync(預設值)時,pg_rewind 將會遞迴地開啟並同步資料目錄中的所有檔案。搜尋檔案時,將會追蹤 WAL 目錄和每個已配置的資料表空間的符號連結。

在 Linux 上,可以使用 syncfs 來要求作業系統同步包含資料目錄、WAL 檔案和每個資料表空間的整個檔案系統。有關使用 syncfs 時需要注意的注意事項,請參閱 recovery_init_sync_method

當使用 --no-sync 時,此選項無效。

-V
--version

顯示版本資訊,然後結束。

-?
--help

顯示說明,然後結束。

環境

當使用 --source-server 選項時,pg_rewind 也會使用 libpq 支援的環境變數(請參閱 第 32.15 節)。

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

注意事項

當使用線上叢集作為來源執行 pg_rewind 時,可以使用具有足夠權限的角色來執行 pg_rewind 在來源叢集上使用的函式,而不是超級使用者。以下是如何建立這樣一個角色,這裡命名為 rewind_user

CREATE USER rewind_user LOGIN;
GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO rewind_user;

運作方式

基本概念是將所有檔案系統層級的變更從來源叢集複製到目標叢集

  1. 掃描目標叢集的 WAL 日誌,從來源叢集的時間軸歷史分叉自目標叢集的時間點之前的最後一個檢查點開始。對於每個 WAL 記錄,記錄每個被觸及的資料區塊。這會產生一個在來源叢集分叉後,目標叢集中所有已變更的資料區塊的清單。如果某些 WAL 檔案不再可用,請嘗試使用 -c 選項重新執行 pg_rewind,以在 WAL 封存中搜尋遺失的檔案。

  2. 使用直接檔案系統存取 (--source-pgdata) 或 SQL (--source-server) 將所有這些已變更的區塊從來源叢集複製到目標叢集。現在,關係檔案的狀態相當於來源和目標的 WAL 時間軸分叉之前完成的最後一個檢查點的時刻,加上目標在該分歧之後變更的任何區塊的來源上的當前狀態。

  3. 將所有其他檔案(包括新的關係檔案、WAL 段、pg_xact 和設定檔)從來源叢集複製到目標叢集。與基礎備份類似,目錄 pg_dynshmem/pg_notify/pg_replslot/pg_serial/pg_snapshots/pg_stat_tmp/pg_subtrans/ 的內容會從來源叢集複製的資料中省略。檔案 backup_labeltablespace_mappg_internal.initpostmaster.optspostmaster.pid.DS_Store,以及任何以 pgsql_tmp 開頭的檔案或目錄,都會被省略。

  4. 建立一個 backup_label 檔案,以便在容錯移轉時建立的檢查點開始 WAL 重播,並使用最小一致性 LSN 來配置 pg_control 檔案。當從運作中的來源倒轉時,該 LSN 定義為 pg_current_wal_insert_lsn() 的結果;當從停止的來源倒轉時,則定義為最後的檢查點 LSN。

  5. 啟動目標時,PostgreSQL 會重播所有必要的 WAL,從而使資料目錄處於一致的狀態。

提交更正

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