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

53.4. 串流複寫協定 #

為了啟動串流複寫,前端會在啟動訊息中傳送 replication 參數。布林值 true(或 onyes1)會告知後端進入實體複寫 walsender 模式,其中可以發出少量複寫命令(如下所示)來代替 SQL 語句。

database 作為 replication 參數的值傳遞,會指示後端進入邏輯複寫 walsender 模式,連接到 dbname 參數中指定的資料庫。在邏輯複寫 walsender 模式中,可以發出下方顯示的複寫命令以及一般的 SQL 命令。

無論是實體複寫還是邏輯複寫 walsender 模式,都只能使用簡單查詢協定。

為了測試複寫命令,您可以透過 psql 或任何其他使用 libpq 的工具建立複寫連線,連線字串中包含 replication 選項,例如:

psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"

但是,使用 pg_receivewal(對於實體複寫)或 pg_recvlogical(對於邏輯複寫)通常更有用。

當啟用 log_replication_commands 時,複寫命令會記錄在伺服器日誌中。

複寫模式下接受的命令為

IDENTIFY_SYSTEM #

請求伺服器識別自身。伺服器回覆包含單列的結果集,其中包含四個欄位

systemid (text)

識別叢集的唯一系統識別碼。這可用於檢查用於初始化備用伺服器的基礎備份是否來自同一個叢集。

timeline (int8)

目前的時程表 ID。這也有助於檢查備用伺服器是否與主要伺服器一致。

xlogpos (text)

目前的 WAL 快取位置。可用於取得預寫日誌中串流可以開始的已知位置。

dbname (text)

連接的資料庫或 null。

SHOW name #

請求伺服器傳送執行階段參數的目前設定。這與 SQL 命令 SHOW 類似。

name

執行階段參數的名稱。可用的參數記錄在 第 19 章 中。

TIMELINE_HISTORY tli #

請求伺服器傳送時程表 tli 的時程表歷史記錄檔案。伺服器回覆包含單列的結果集,其中包含兩個欄位。雖然欄位標記為 text,但它們有效地傳回原始位元組,沒有編碼轉換

filename (text)

時程表歷史記錄檔案的檔案名稱,例如 00000002.history

content (text)

時程表歷史記錄檔案的內容。

CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL | LOGICAL output_plugin } [ ( option [, ...] ) ] #

建立實體或邏輯複寫槽。有關複寫槽的更多資訊,請參閱 第 26.2.6 節

slot_name

要建立的槽的名稱。必須是有效的複寫槽名稱(請參閱 第 26.2.6.1 節)。

output_plugin

用於邏輯解碼的輸出外掛程式的名稱(請參閱 第 47.6 節)。

TEMPORARY

指定此複寫槽是臨時槽。臨時槽不會儲存到磁碟,並且會在發生錯誤或會話結束時自動捨棄。

支援以下選項

TWO_PHASE [ boolean ]

如果為 true,這個邏輯複製槽會支援二階段提交的解碼。使用這個選項,與二階段提交相關的命令,例如 PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED 將會被解碼並傳輸。該交易將在 PREPARE TRANSACTION 時被解碼和傳輸。預設值為 false。

RESERVE_WAL [ boolean ]

如果為 true,這個實體複製槽會立即保留WAL。否則,WAL只會在來自串流複製用戶端的連線時才保留。預設值為 false。

SNAPSHOT { 'export' | 'use' | 'nothing' }

決定如何處理在邏輯槽初始化期間建立的快照。'export' 是預設值,會匯出快照以供其他工作階段使用。此選項不能在交易中使用。'use' 會將快照用於執行該命令的目前交易。這個選項必須在交易中使用,而且 CREATE_REPLICATION_SLOT 必須是該交易中執行的第一個命令。最後,'nothing' 只會像往常一樣使用快照進行邏輯解碼,但不會對其進行任何其他操作。

FAILOVER [ boolean ]

如果為 true,則該槽會啟用同步到待機端,以便在容錯移轉後可以恢復邏輯複製。預設值為 false。

為了回應這個命令,伺服器會傳送一個包含以下欄位的一列結果集

slot_name (text)

新建立的複製槽的名稱。

consistent_point (text)

槽變成一致時的 WAL 位置。這是可以在此複製槽上開始串流的最早位置。

snapshot_name (text)

由命令匯出的快照的識別碼。快照在連接上執行新命令或複製連線關閉之前有效。如果建立的槽是實體的,則為 Null。

output_plugin (text)

新建立的複製槽使用的輸出外掛程式的名稱。如果建立的槽是實體的,則為 Null。

CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL [ RESERVE_WAL ] | LOGICAL output_plugin [ EXPORT_SNAPSHOT | NOEXPORT_SNAPSHOT | USE_SNAPSHOT | TWO_PHASE ] } #

為了與舊版本相容,仍然支援 CREATE_REPLICATION_SLOT 命令的這種替代語法。

ALTER_REPLICATION_SLOT slot_name ( option [, ...] ) #

變更複製槽的定義。有關複製槽的更多資訊,請參閱 第 26.2.6 節。目前僅邏輯複製槽支援此命令。

slot_name

要變更的槽的名稱。必須是有效的複製槽名稱(請參閱 第 26.2.6.1 節)。

支援以下選項

FAILOVER [ boolean ]

如果為 true,則該槽會啟用同步到待機端,以便在容錯移轉後可以恢復邏輯複製。

READ_REPLICATION_SLOT slot_name #

讀取與複製槽相關的一些資訊。如果複製槽不存在,則傳回帶有 NULL 值的 tuple。目前僅實體複製槽支援此命令。

為了回應這個命令,伺服器會傳回一個單列結果集,其中包含以下欄位

slot_type (text)

複製槽的類型,可以是 physicalNULL

restart_lsn (text)

複製槽的 restart_lsn

restart_tli (int8)

restart_lsn 關聯的時間軸 ID,遵循目前的時間軸歷史記錄。

START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ] #

指示伺服器開始串流 WAL,從 WAL 位置 XXX/XXX 開始。如果指定了 TIMELINE 選項,則串流從時間軸 tli 開始;否則,將選擇伺服器目前的時間軸。伺服器可能會回復錯誤,例如,如果請求的 WAL 區段已被回收。成功後,伺服器會回復 CopyBothResponse 訊息,然後開始將 WAL 串流到前端。

如果透過 slot_name 提供了槽的名稱,則會隨著複製的進行而更新它,以便伺服器知道待機端仍然需要哪些 WAL 區段,以及如果 hot_standby_feedback 開啟,哪些交易仍然需要。

如果用戶端請求的時間軸不是最新的,但屬於伺服器的歷史記錄的一部分,則伺服器將從請求的起點開始,在該時間軸上串流所有 WAL,直到伺服器切換到另一個時間軸為止。如果用戶端請求在舊時間軸的末尾進行串流,則伺服器將完全跳過 COPY 模式。

在串流完不是最新的時間軸上的所有 WAL 之後,伺服器將透過退出 COPY 模式來結束串流。當用戶端也透過退出 COPY 模式來確認此操作時,伺服器會傳送一個具有一行和兩列的結果集,指示此伺服器歷史記錄中的下一個時間軸。第一列是下一個時間軸的 ID(類型 int8),第二列是切換發生的 WAL 位置(類型 text)。通常,切換位置是已串流 WAL 的結尾,但是在某些邊緣情況下,伺服器可以傳送來自舊時間軸的一些 WAL,而它自己尚未在升級之前重新執行。最後,伺服器會傳送兩個 CommandComplete 訊息(一個結束 CopyData,另一個結束 START_REPLICATION 本身),並準備好接受新命令。

WAL 資料以一系列 CopyData 訊息傳送;詳細資訊請參閱第 53.6 節第 53.7 節。(這允許其他資訊混雜其中;特別是,如果伺服器在開始串流後遇到失敗,它可以傳送 ErrorResponse 訊息。)從伺服器傳送到客戶端的每個 CopyData 訊息的 payload 包含以下格式之一的訊息

XLogData (B) #
Byte1('w')

將訊息識別為 WAL 資料。

Int64

此訊息中 WAL 資料的起始點。

Int64

伺服器上目前 WAL 的結束點。

Int64

傳輸時伺服器的系統時鐘,以自 2000-01-01 午夜以來的微秒數表示。

Byten

WAL 資料流的一個區段。

單個 WAL 記錄永遠不會跨越兩個 XLogData 訊息。當 WAL 記錄跨越 WAL 頁面邊界,並且因此已經使用 continuation 記錄分割時,它可以在頁面邊界處分割。換句話說,第一個主 WAL 記錄及其 continuation 記錄可以在不同的 XLogData 訊息中傳送。

主伺服器心跳訊息 (B) #
Byte1('k')

將訊息識別為發送者心跳。

Int64

伺服器上目前 WAL 的結束點。

Int64

傳輸時伺服器的系統時鐘,以自 2000-01-01 午夜以來的微秒數表示。

Byte1

1 表示客戶端應儘快回覆此訊息,以避免逾時斷線。 0 表示否則。

接收程序可以隨時將回覆傳送回發送者,使用以下訊息格式之一(也在 CopyData 訊息的 payload 中)

備用伺服器狀態更新 (F) #
Byte1('r')

將訊息識別為接收器狀態更新。

Int64

備用伺服器中最後一個已接收並寫入磁碟的 WAL 位元組 + 1 的位置。

Int64

備用伺服器中最後一個已刷新到磁碟的 WAL 位元組 + 1 的位置。

Int64

備用伺服器中最後一個已應用的 WAL 位元組 + 1 的位置。

Int64

傳輸時客戶端的系統時鐘,以自 2000-01-01 午夜以來的微秒數表示。

Byte1

如果為 1,則客戶端請求伺服器立即回覆此訊息。這可用於 ping 伺服器,以測試連線是否仍然正常。

熱備份回饋訊息 (F) #
Byte1('h')

將訊息識別為熱備份回饋訊息。

Int64

傳輸時客戶端的系統時鐘,以自 2000-01-01 午夜以來的微秒數表示。

Int32

備用伺服器目前的全域 xmin,不包括任何複製槽的 catalog_xmin。如果此值和下面的 catalog_xmin 都為 0,則將其視為通知,表示將不再在此連線上傳送熱備份回饋。後續的非零訊息可能會重新啟動回饋機制。

Int32

備用伺服器上全域 xmin xid 的 epoch。

Int32

備用伺服器上任何複製槽的最低 catalog_xmin。如果備用伺服器上不存在 catalog_xmin,或如果正在停用熱備份回饋,則設定為 0。

Int32

備用伺服器上 catalog_xmin xid 的 epoch。

START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, ...] ) ] #

指示伺服器開始串流邏輯複製的 WAL,從 WAL 位置 XXX/XXX 或槽的 confirmed_flush_lsn 開始(請參閱第 52.19 節),以較大者為準。此行為使客戶端更容易避免在沒有資料要處理時更新其本機 LSN 狀態。但是,從與請求不同的 LSN 開始可能無法捕獲某些種類的客戶端錯誤;因此,客戶端可能希望在發出 START_REPLICATION 之前檢查 confirmed_flush_lsn 是否符合其預期。

伺服器可以回覆錯誤,例如,如果該槽不存在。成功後,伺服器會回覆 CopyBothResponse 訊息,然後開始將 WAL 串流到前端。

CopyBothResponse 訊息中的訊息格式與為 START_REPLICATION ... PHYSICAL 記錄的格式相同,包括兩個 CommandComplete 訊息。

與所選槽關聯的輸出外掛程式用於處理串流的輸出。

SLOT slot_name

要從中串流變更的槽名稱。此參數為必填項,並且必須對應於使用 LOGICAL 模式下的 CREATE_REPLICATION_SLOT 建立的現有邏輯複製槽。

XXX/XXX

開始串流的 WAL 位置。

option_name

傳遞給槽的邏輯解碼輸出外掛程式的選項名稱。 有關標準外掛程式 (pgoutput) 接受的選項,請參閱第 53.5 節

option_value

與指定選項關聯的可選值,採用字串常數的形式。

DROP_REPLICATION_SLOT slot_name [ WAIT ] #

刪除複製槽,釋放任何保留的伺服器端資源。如果槽是一個邏輯槽,該槽是在 walsender 連接到的資料庫之外的資料庫中建立的,則此命令會失敗。

slot_name

要刪除的槽名稱。

WAIT

如果槽處於活動狀態,此選項會使命令等待,直到它變為非活動狀態,而不是預設行為,即引發錯誤。

UPLOAD_MANIFEST #

上傳備份資訊清單,以準備進行增量備份。

BASE_BACKUP [ ( option [, ...] ) ] #

指示伺服器開始串流基本備份。系統會在備份開始之前自動進入備份模式,並在備份完成後退出備份模式。接受以下選項

LABEL 'label'

設定備份的標籤。如果未指定,將使用 base backup 的備份標籤。標籤的引用規則與開啟 standard_conforming_strings 的標準 SQL 字串相同。

TARGET 'target'

告訴伺服器將備份傳送到哪裡。如果目標是預設值 client,則備份資料會傳送到客戶端。如果目標是 server,則備份資料會寫入由 TARGET_DETAIL 選項指定的路徑名稱的伺服器。如果目標是 blackhole,則備份資料不會傳送到任何地方;它只是被丟棄。

server 目標需要超級使用者權限或被授予 pg_write_server_files 角色。

TARGET_DETAIL 'detail'

提供有關備份目標的其他資訊。

目前,此選項只能在備份目標為 server 時使用。它指定應將備份寫入的伺服器目錄。

PROGRESS [ boolean ]

若設為 true,則請求產生進度報告所需的資訊。這會傳回每個表空間標頭中的近似大小,可用於計算串流完成的程度。這是透過在傳輸開始之前枚舉所有檔案大小來計算的,因此可能會對效能產生負面影響。特別是,可能需要更長的時間才能串流第一個資料。由於資料庫檔案在備份期間可能會變更,因此大小僅為近似值,並且在近似時間與傳送實際檔案之間可能會增大和縮小。預設值為 false。

CHECKPOINT { 'fast' | 'spread' }

設定在基本備份開始時執行的檢查點類型。預設值為 spread

WAL [ boolean ]

若設為 true,則在備份中包含必要的 WAL 區段。這將包含基本目錄 tar 檔案的 pg_wal 目錄中,開始和停止備份之間的所有檔案。預設值為 false。

WAIT [ boolean ]

若設為 true,則備份將等待直到最後一個需要的 WAL 區段已歸檔,或者在未啟用 WAL 歸檔時發出警告。若為 false,則備份既不會等待也不會警告,讓用戶端負責確保所需的日誌可用。預設值為 true。

COMPRESSION 'method'

指示伺服器使用指定的方法壓縮備份。目前,支援的方法有 gziplz4zstd

COMPRESSION_DETAIL detail

指定所選壓縮方法的詳細資訊。這應該僅與 COMPRESSION 選項一起使用。如果值為整數,則指定壓縮級別。否則,它應該是以逗號分隔的項目清單,每個項目的形式為 keywordkeyword=value。目前,支援的關鍵字有 levellongworkers

level 關鍵字設定壓縮級別。對於 gzip,壓縮級別應該是介於 19 之間的整數(預設 Z_DEFAULT_COMPRESSION-1),對於 lz4,整數介於 1 和 12 之間(預設 0 表示快速壓縮模式),對於 zstd,整數介於 ZSTD_minCLevel()(通常為 -131072)和 ZSTD_maxCLevel()(通常為 22)之間(預設 ZSTD_CLEVEL_DEFAULT3)。

long 關鍵字啟用長距離匹配模式,以提高壓縮率,但代價是更高的記憶體使用量。長距離模式僅支援 zstd

workers 關鍵字設定應該用於平行壓縮的執行緒數。平行壓縮僅支援 zstd

MAX_RATE rate

限制(限制)每單位時間從伺服器傳輸到用戶端的最大資料量。預期的單位是每秒千位元組。如果指定此選項,則該值必須等於零,或者必須落在 32 kB 到 1 GB(含)的範圍內。如果傳遞零或未指定該選項,則不會對傳輸施加任何限制。

TABLESPACE_MAP [ boolean ]

如果為 true,則在名為 tablespace_map 的檔案中包含有關目錄 pg_tblspc 中存在的符號連結的資訊。表空間映射檔案包含每個符號連結名稱,因為它存在於目錄 pg_tblspc/ 中,以及該符號連結的完整路徑。預設值為 false。

VERIFY_CHECKSUMS [ boolean ]

如果為 true,則在啟用檢查和的情況下,會在基本備份期間驗證檢查和。如果為 false,則會跳過此步驟。預設值為 true。

MANIFEST manifest_option

當指定此選項的值為 yesforce-encode 時,會建立備份清單並隨備份一起傳送。該清單是備份中存在的每個檔案的清單,但不包括可能包含的任何 WAL 檔案。它還儲存每個檔案的大小、上次修改時間,並且可以選擇儲存檢查和。force-encode 值會強制所有檔案名稱進行十六進位編碼;否則,僅對名稱為非 UTF8 八位元序列的檔案執行此類型的編碼。force-encode 主要用於測試目的,以確保讀取備份清單的用戶端可以處理這種情況。為了與先前的版本相容,預設值為 MANIFEST 'no'

MANIFEST_CHECKSUMS checksum_algorithm

指定應該應用於備份清單中包含的每個檔案的檢查和演算法。目前,可用的演算法有 NONECRC32CSHA224SHA256SHA384SHA512。預設值為 CRC32C

INCREMENTAL

請求增量備份。在執行具有此選項的基本備份之前,必須先執行 UPLOAD_MANIFEST 命令。

備份開始時,伺服器將首先傳送兩個普通結果集,然後傳送一個或多個 CopyOutResponse 結果。

第一個普通結果集包含備份的起始位置,位於具有兩列的單個列中。第一列包含以 XLogRecPtr 格式給出的起始位置,第二列包含相應的時間軸 ID。

第二個普通結果集為每個表空間都有一列。此列中的欄位為

spcoid (oid)

表空間的 OID,如果它是基本目錄,則為 null。

spclocation (text)

表空間目錄的完整路徑,如果它是基本目錄,則為 null。

size (int8)

如果已請求進度報告,則表空間的近似大小(以千位元組(1024 位元組)為單位);否則為 null。

在第二個常規結果集之後,將傳送 CopyOutResponse。每個 CopyData 訊息的 payload 將包含以下格式之一的訊息

new archive (B)
Byte1('n')

將訊息識別為指示新封存的開始。主資料目錄和每個額外的表空間都有一個封存;每個都將使用 tar 格式(遵循 POSIX 1003.1-2008 標準中指定的 ustar 交換格式)。

String

此封存的檔案名稱。

String

對於主資料目錄,為空字串。對於其他表空間,則是從中建立此封存的目錄的完整路徑。

manifest (B)
Byte1('m')

將訊息識別為指示備份清單的開始。

archive or manifest data (B)
Byte1('d')

將訊息識別為包含封存或清單資料。

Byten

資料位元組。

progress report (B)
Byte1('p')

將訊息識別為進度報告。

Int64

已完成處理的目前表空間的位元組數。

在傳送 CopyOutResponse 或所有此類回應後,將傳送最終的普通結果集,其中包含備份的 WAL 結束位置,其格式與起始位置相同。

資料目錄和每個表空間的 tar 封存將包含目錄中的所有檔案,無論它們是 PostgreSQL 檔案還是新增到相同目錄的其他檔案。唯一排除的檔案是

  • postmaster.pid

  • postmaster.opts

  • pg_internal.init (存在於多個目錄)

  • PostgreSQL 伺服器運作期間建立的各種暫存檔案和目錄,例如任何以 pgsql_tmp 開頭的檔案或目錄以及暫時關聯。

  • 未記錄的關聯,除了初始化分支,該分支需要在恢復時重新建立(空的)未記錄關聯。

  • pg_wal,包含子目錄。 如果備份執行時包含 WAL 檔案,則會包含一個合成版本的 pg_wal,但它只會包含備份工作所需的檔案,而不是其餘的內容。

  • pg_dynshmempg_notifypg_replslotpg_serialpg_snapshotspg_stat_tmppg_subtrans 會複製為空目錄(即使它們是符號連結)。

  • 檔案類型不是常規檔案和目錄,例如符號連結(除了上面列出的目錄)和特殊裝置和作業系統檔案,會被跳過。(pg_tblspc 中的符號連結會被保留。)

如果伺服器上的底層檔案系統支援,則會設定所有者、群組和檔案模式。

在上述所有指令中,指定類型為 boolean 的參數時,可以省略 value 部分,這相當於指定 TRUE

提交更正

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