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 封存檔中檢索這些檔案。
--config-file=filename
使用指定的目標叢集的主要伺服器設定檔。當 pg_rewind 內部使用 postgres 命令對此叢集執行回溯操作時(當使用 -c/--restore-target-wal
選項檢索 restore_command
時,以及強制完成崩潰恢復時),此選項會影響 pg_rewind。
--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
指定是否在診斷訊息中使用顏色。可能的值為 always
、auto
和 never
。
當使用線上叢集作為來源執行 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;
基本概念是將所有檔案系統層級的變更從來源叢集複製到目標叢集
掃描目標叢集的 WAL 日誌,從來源叢集的時間軸歷史從目標叢集分支出來之前的最後一個檢查點開始。對於每個 WAL 記錄,記錄每個被觸及的資料區塊。這會產生目標叢集中在來源叢集分支後所變更的所有資料區塊的清單。如果某些 WAL 檔案不再可用,請嘗試重新執行 pg_rewind,並使用 -c
選項在 WAL 封存檔中搜尋遺失的檔案。
使用直接檔案系統存取 (--source-pgdata
) 或 SQL (--source-server
) 將所有這些已變更的區塊從來源叢集複製到目標叢集。現在,關聯檔案的狀態等同於來源和目標的 WAL 時間軸分歧之前的最後一個完成的檢查點的時刻,加上來源上在目標叢集分歧後變更的任何區塊的目前狀態。
將所有其他檔案(包括新的關聯檔案、WAL 片段、pg_xact
和設定檔)從來源叢集複製到目標叢集。與基本備份類似,目錄 pg_dynshmem/
、pg_notify/
、pg_replslot/
、pg_serial/
、pg_snapshots/
、pg_stat_tmp/
和 pg_subtrans/
的內容會從來源叢集複製的資料中省略。檔案 backup_label
、tablespace_map
、pg_internal.init
、postmaster.opts
、postmaster.pid
和 .DS_Store
,以及任何以 pgsql_tmp
開頭的檔案或目錄,都會被省略。
建立一個 backup_label
檔案,以便在故障轉移時建立的檢查點開始 WAL 重播,並使用在從即時來源回溯時定義為 pg_current_wal_insert_lsn()
的結果或在從已停止的來源回溯時定義為最後一個檢查點 LSN 的最小一致性 LSN 來配置 pg_control
檔案。
當啟動目標時,PostgreSQL 會重播所有需要的 WAL,從而使資料目錄處於一致的狀態。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表單來報告文件問題。