pg_rewind—使一個PostgreSQL數據目錄與另一個數據目錄(該目錄從第一個PostgreSQL數據目錄創建而來)一致。
描述
pg_rewind是一個在集群的時間線參數偏離之后,用於使一個PostgreSQL集群與另一個相同集群的拷貝同步的工具。一個典型的場景是在故障轉移之后,讓一個老的主服務器重新在線作為一個standby跟隨新主服務器。
其結果相當於使用源數據目錄替換目標數據目錄。所有的文件都被拷貝,包括配置文件。與做一個基礎備份或者像rsync這樣的工具相比,pg_rewind的優勢是pg_rewind不需要讀取所有集群中沒有更改的文件。當數據庫很大,並且只有一小部分不同的集群之間,使它的速度快得多。
pg_rewind檢查源集群與目標集群的時間線歷史來檢測它們產生分歧的點,並希望在目標集群的pg_xlog目錄找到WAL回到分歧點的所有方式。在典型的故障轉移場景:目標集群在分歧之后立即被關閉,那是沒有問題的,但是,如果目標集群在分歧之后運行了很長一段時間,老的WAL文件可能不存在了。在這種情況下,它們可以手動從WAL歸檔復制到pg_xlog目錄。目前不支持從一個WAL歸檔中自動獲取丟失的文件。
在運行pg_rewind之后,當目標服務器第一次被啟動,它將進入恢復模式並重放從分歧點之后源服務器產生的所有WAL。當pg_rewind被運行時,如果一些 WAL在源服務器上不再可用,因此不能用pg_rewind回話復制,當目標服務器被啟動時時可以的。這可以通過在目標數據目錄創建一個帶有合適的restore_command命令的recovery.conf文件來實現。
選項
pg_rewind 接受下列命令行參數:
-D 目錄
--target-pgdata=目錄
該選項指定與源同步的目標數據目錄。
--source-pgdata=目錄
指定源服務器的數據目錄的路徑,以使目標數據目錄與之同步。當—source-pgdata被使用時,源服務器必須被關閉。
--source-server=連接字符串
指定一個libpq連接字符串以連接到源PostgreSQL服務器來使目標同步。服務器必須開啟並允許,並且不能處於恢復模式。
-n
--dry-run
做除了修改目標目錄的所有事情。
-P
--progress
開啟進程報告。在從源集群復制數據時,打開這個功能將提供一個近似的進度報告。
--debug
打印詳細的調試輸出對開發者調試pg_rewind來說是非常有用的。
-V
--version
顯示版本信息並退出。
-?
--help
顯示幫助,然后退出
環境
當—source-server選項被使用時,pg_rewind也使用libpq支持的環境變量(見31.14節)。
注意
pg_rewind需要啟用postgresql.conf中的wal_log_hints 選項,或者當集群被使用initdb初始化時啟用數據校驗。full_page_writes也必須啟用。
pg_rewind是如何工作的
基本的思想是從新的集群拷貝所有的東西到老的集群,除了我們知道的相同的(數據)塊。
1.從最后一個檢查點開始掃描老集群的WAL日志,在該檢查點之前,新集群的時間線歷史從老集群被創建出來。對於每一個WAL記錄,做一個數據塊被觸及的記錄。在新的集群被創建出來以后,這產生所有在老集群中被更改的數據塊的列表。
2.從新集群復制所有這些被更改的數據塊到老集群。
3.從新集群復制所有其它像clog,conf這樣的文件等等到老集群。每個文件,除了表文件。
4.從新集群應用WAL,從故障轉移創建的檢查點開始。(嚴格的說,pg_rewind不應用WAL,它只是創建一個備份標簽文件以表明PostgreSQL被啟動了,它會從檢查點重放並應用所有需要的WAL)
https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.5
