PostgreSQL pg_rewind

2021-09-13 17:29 更新

pg_rewind — 把一個PostgreSQL數(shù)據(jù)目錄與另一個從該目錄中復制出來的數(shù)據(jù)目錄同步

大綱

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

簡介

pg_rewind是用于在集簇的時間線分叉以后,同步一個 PostgreSQL 集簇和同一集簇的另一份拷貝的工具。一種典型的場景是在失效后讓一個舊的主服務器重新上線,同時有一個后備機跟隨著新的主機。

成功回放后,目標數(shù)據(jù)目錄的狀態(tài)類似于源數(shù)據(jù)目錄的基本備份。與進行新的基本備份或使用rsync等工具不同,pg_rewind不需要比較或復制集群中未更改的關系塊。僅復制現(xiàn)有關系文件中更改的塊;所有其他文件(包括新的關系文件、配置文件和WAL段)都將被完整復制。因此,當數(shù)據(jù)庫很大并且集群之間只有一小部分塊不同時,倒帶操作比其他方法要快得多。

pg_rewind檢查源集簇和目標集簇的時間線歷史來判斷它們在哪一點分叉,并且期望在目標集簇的pg_wal目錄中找到 WAL 來返回到分叉點。分叉點可能會在目標時間線、源時間線或者它們的共同祖先上找到。在典型的失效場景中,目標集簇在分叉后很快就被關閉,這不是問題,但是如果目標集簇在分叉后已經(jīng)運行了很長時間,舊的 WAL 文件可能已經(jīng)不存在了。在這樣的情況下,您可以手動將它們從WAL存檔復制到 pg_wal目錄,或使用-c選項運行pg_rewind以自動從WAL存檔檢索它們。pg_rewind的使用并不限于失效的場景,例如一個后備服務器可能被提升、運行一些寫事務,然后被倒回再次成為一個后備。

在運行pg_rewind之后,需要完成WAL重放以使數(shù)據(jù)目錄處于一致狀態(tài)。當目標服務器再次啟動時,它將進入歸檔恢復,并從分歧點之前的最后一個檢查點重放源服務器中生成的所有 WAL。當pg_rewind被運行時有某些 WAL 在源服務器上不可用,并且因此無法被pg_rewind會話所復制,則在目標服務器被啟動時必須讓這些 WAL 可用。 這可以通過在目標數(shù)據(jù)目錄中創(chuàng)建一個recovery.signal文件并且在postgresql.conf中配置適合的restore_command來實現(xiàn)。

pg_rewind要求目標服務器在postgresql.conf中啟用了wal_log_hints選項,或者在用initdb初始化集簇時啟用了數(shù)據(jù)校驗。目前默認情況下這兩者都沒有被打開。 full_page_writes也必須被設置為on,這是默認的。

警告

如果在處理時pg_rewind失敗,則目標的數(shù)據(jù)目錄很可能不在可恢復的狀態(tài)。在這種情況下,推薦創(chuàng)建一個新的備份。

由于 pg_rewind 完全從源復制配置文件,因此可能需要在重新啟動目標服務器之前更正用于恢復的配置,特別是當目標服務器作為源的備用服務器重新引入時。 如果在倒帶操作完成后重新啟動服務器但未配置恢復,則目標可能會再次與主服務器分離。

如果pg_rewind發(fā)現(xiàn)它無法直接寫入的文件,它將立刻失敗。例如當源服務器和目標服務器為只讀的SSL密鑰及證書使用相同的文件映射,就會發(fā)生這種情況。如果在目標服務器上存在這樣的文件,推薦在運行pg_rewind之前移除它們。在做了rewind之后,一些那樣的文件可能已經(jīng)被從源服務器拷貝,這樣就有必要移除已經(jīng)拷貝的數(shù)據(jù)并且恢復到rewind之前使用的鏈接集合。

選項

pg_rewind接受下列命令行參數(shù):

-D directory
--target-pgdata=directory

這個選項指定要與源數(shù)據(jù)目錄同步的目標數(shù)據(jù)目錄。在運行pg_rewind之前目標服務器必須被干凈地關閉。

--source-pgdata=directory

指定要和目標服務器同步的源服務器的數(shù)據(jù)目錄的文件系統(tǒng)路徑。這個選項要求源服務器必須被干凈地關閉。

--source-server=connstr

指定一個 libpq 連接串用于連接要與目標服務器同步的源PostgreSQL服務器。 連接必須是常規(guī)(非復制)連接,角色具有足夠權限執(zhí)行源服務器上pg_rewind使用的函數(shù)(詳請參閱備注部分)或超級用戶角色。這個選項要求源服務器正在運行且不處于恢復模式。

-R
--write-recovery-conf

創(chuàng)建standby.signal并將連接設置附加到輸出目錄中的postgresql.auto.conf中。--source-server對于此選項是必需的。

-n
--dry-run

做除了實際修改目標目錄之外的其他所有事情。

-N
--no-sync

默認情況下,pg_rewind將等待所有文件安全地寫入磁盤。 此選項會導致pg_rewind不等待即可返回,這更快,但意味著后續(xù)操作系統(tǒng)崩潰會使同步數(shù)據(jù)目錄損壞。通常情況,此選項可用于測試,但不應使用于生產安裝。

-P
--progress

啟用進度報告。在從源集簇拷貝數(shù)據(jù)時,打開這個選項將會發(fā)送一個近似的進度報告。

-c
--restore-target-wal

如果在pg_wal目錄中不再可用這些文件,請使用在目標群集配置中定義的restore_command從WAL存檔中檢索WAL文件。

--debug

打印冗長的調試輸出,這主要對于調試pg_rewind的開發(fā)者有用。

--no-ensure-shutdown

pg_rewind 要求目標服務器在倒帶之前徹底關閉。 默認情況下,如果目標服務器沒有完全關閉,pg_rewind 會以單用戶模式啟動目標服務器,先完成崩潰恢復,然后將其停止。 通過傳遞這個選項,如果服務器沒有完全關閉,pg_rewind 會跳過這個并立即出錯。 在這種情況下,用戶應該自己處理這種情況。

-V
--version

顯示版本信息然后退出。

-?
--help

顯示幫助然后退出。

環(huán)境

在使用--source-server選項時,pg_rewind也使用libpq支持的環(huán)境變量(見第 33.14 節(jié))。

環(huán)境變量PG_COLOR規(guī)定在診斷消息中是否使用顏色??赡艿闹禐?code class="literal">always、auto、never

注解

當使用在線群集作為源執(zhí)行pg_rewind時,具有充足權限來執(zhí)行pg_rewind在源群集上使用的函數(shù)的角色可以用來代替超級用戶。 這里介紹如何創(chuàng)建這樣的角色,在這里命名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;

當使用近期升級的在線群集作為源執(zhí)行pg_rewind時,必須在升級后執(zhí)行CHECKPOINT以便其控制文件反映最新的時間線信息, pg_rewind使用這些信息檢查目標群集是否可以使用指定的源群集倒回。

如何工作

其基本思想是從源集簇拷貝所有文件系統(tǒng)級別的改變到目標集簇:

  1. 以源集簇的時間線歷史從目標集簇分叉出來的點之前的最后一個檢查點為起點,掃描目標集簇的 WAL 日志。對于每一個 WAL 記錄,讀取每一個被動過的數(shù)據(jù)塊。這會得到在目標集簇中從源集簇被分支出去以后所有被更改過的數(shù)據(jù)塊列表。如果某些 WAL 文件 不再可用,請嘗試使用 -c 選項重新運行 pg_rewind 以在 WAL 存檔中搜索丟失的文件。

  2. 使用直接的文件系統(tǒng)訪問(--source-pgdata)或者 SQL (--source-server),把所有那些更改過的塊從源集簇拷貝到目標集簇。 關系文件現(xiàn)在的狀態(tài)相當于源和目標的WAL時間線偏離點之前最后一個完成的檢查點的時刻加上偏離點之后目標上更改的任何塊的源上的當前狀態(tài)。

  3. 將所有其他文件,包括新的關系文件、WAL段、pg_xact和配置文件,從源集群復制到目標集群。與基本備份類似,從源集群復制的數(shù)據(jù)中省略了目錄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,以及任何以pgsql_tmp開始的文件或目錄都會被忽略。

  4. 創(chuàng)建一個backup_label文件,在故障轉移時創(chuàng)建的檢查點處開始WAL重放,并將pg_control文件配置為最小一致性LSN,該LSN定義為從活動源回放時的pg_current_wal_insert_lsn()結果,或從停止的源回放時的最后一個檢查點LSN。

  5. 啟動目標時,PostgreSQL將重放所有必需的WAL,從而使數(shù)據(jù)目錄處于一致狀態(tài)。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號