2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前18) / 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

19.6. 複製 #

這些設定控制內建的流複製功能(參見第 26.2.5 節)以及內建的邏輯複製功能(參見第 29 章)的行為。

對於流複製,伺服器將是主伺服器或備用伺服器。主伺服器可以傳送資料,而備用伺服器始終是複製資料的接收者。當使用級聯複製(參見第 26.2.7 節)時,備用伺服器也可以是傳送者,同時也是接收者。引數主要用於傳送伺服器和備用伺服器,儘管某些引數僅在主伺服器上有意義。如果需要,叢集中的設定可能會因群集而異,而不會出現問題。

對於邏輯複製釋出者(執行CREATE PUBLICATION 的伺服器)將資料複製到訂閱者(執行CREATE SUBSCRIPTION 的伺服器)。伺服器也可以同時作為釋出者和訂閱者。注意,以下部分將釋出者稱為“傳送者”。有關邏輯複製配置設定的更多詳細資訊,請參閱第 29.12 節

19.6.1. 傳送伺服器 #

這些引數可以設定在任何要向一個或多個備用伺服器傳送複製資料的伺服器上。主伺服器始終是傳送伺服器,因此這些引數必須始終在主伺服器上設定。這些引數的角色和含義在備用伺服器成為主伺服器後不會改變。

max_wal_sendersinteger #

指定來自備用伺服器或流式基礎備份客戶端的最大併發連線數(即,同時執行的 WAL 傳送程序的最大數量)。預設值為 10。值為 0 表示複製已停用。流式客戶端的突然斷開連線可能會在超時之前留下一個孤立的連線槽,因此此引數應設定為略高於預期客戶端的最大數量,以便斷開連線的客戶端可以立即重新連線。此引數只能在伺服器啟動時設定。另外,wal_level 必須設定為 replica 或更高版本才能允許備用伺服器進行連線。

執行備用伺服器時,必須將此引數設定為與主伺服器相同或更高的值。否則,將不允許在備用伺服器上執行查詢。

max_replication_slotsinteger #

指定伺服器支援的最大複製槽數(參見第 26.2.6 節)。預設值為 10。此引數只能在伺服器啟動時設定。將其設定為小於當前存在的複製槽數的任何值都將阻止伺服器啟動。另外,wal_level 必須設定為 replica 或更高版本才能允許使用複製槽。

wal_keep_sizeinteger #

指定 pg_wal 目錄中儲存的過去 WAL 檔案的最小大小,以防備用伺服器需要獲取它們進行流複製。如果連線到傳送伺服器的備用伺服器落後超過 wal_keep_size MB,傳送伺服器可能會刪除備用伺服器仍需要的 WAL 段,在這種情況下,複製連線將終止。下游連線最終也會因此失敗。(但是,如果使用了 WAL 歸檔,備用伺服器可以從歸檔中恢復。)

這僅設定 pg_wal 中保留的段的最小大小;系統可能需要保留更多段以用於 WAL 歸檔或從檢查點恢復。如果 wal_keep_size 為零(預設值),系統不會保留任何額外的段供備用伺服器使用,因此備用伺服器可用的舊 WAL 段的數量取決於前一個檢查點的位置和 WAL 歸檔的狀態。如果未指定單位,則此值被視為兆位元組。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

max_slot_wal_keep_sizeinteger #

指定在檢查點時,複製槽允許在 pg_wal 目錄中保留的 WAL 檔案的最大大小。如果 max_slot_wal_keep_size 為 -1(預設值),複製槽可以保留無限數量的 WAL 檔案。否則,如果複製槽的 restart_lsn 落後於當前 LSN 的大小超過給定大小,則使用該槽的備用伺服器可能無法繼續複製,因為必需的 WAL 檔案已被刪除。您可以在 pg_replication_slots 中檢視複製槽的 WAL 可用性。如果未指定單位,則此值被視為兆位元組。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

idle_replication_slot_timeoutinteger #

使已保持非活動狀態(未被複製連線使用)超過此持續時間的複製槽無效。如果未指定單位,則此值被視為秒。值為零(預設值)將停用空閒超時無效機制。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

由於空閒超時導致的槽無效發生在檢查點期間。因為檢查點每 checkpoint_timeout 間隔發生一次,所以從 idle_replication_slot_timeout 超過到下一個檢查點觸發槽無效之間可能存在一些延遲。為避免這種延遲,使用者可以強制進行檢查點以及時使不活動的槽無效。槽不活動時間使用槽的 pg_replication_slots.inactive_since 值計算。

請注意,空閒超時無效機制不適用於不保留 WAL 的槽,也不適用於正在從主伺服器同步的備用伺服器上的槽(即,pg_replication_slots.synced 值為 true 的備用槽)。已同步的槽始終被視為不活動,因為它們不執行邏輯解碼以生成更改。

wal_sender_timeoutinteger #

終止不活動時間超過此持續時間的複製連線。這對於傳送伺服器檢測備用伺服器崩潰或網路中斷非常有用。如果未指定單位,則此值被視為毫秒。預設值為 60 秒。值為零停用超時機制。

當叢集分佈在多個地理位置時,為每個位置使用不同的值可以為叢集管理帶來更大的靈活性。對於具有低延遲網路連線的備用伺服器,較小的值有助於更快地檢測到故障;對於位於高延遲網路連線的遠端位置的備用伺服器,較大的值有助於更好地判斷其健康狀況。

track_commit_timestampboolean #

記錄事務的提交時間。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 off

synchronized_standby_slotsstring #

邏輯 WAL 傳送程序將等待的流複製備用伺服器槽名稱的逗號分隔列表。邏輯 WAL 傳送程序僅在指定的複製槽確認接收 WAL 後才會將解碼後的更改傳送給外掛。這確保了邏輯複製故障轉移槽在更改被接收並重新整理到相應的物理備用伺服器之前不會消耗更改。如果邏輯複製連線旨在故障轉移到物理備用伺服器,則備用伺服器的物理複製槽應在此處列出。請注意,如果 synchronized_standby_slots 中指定的槽不存在或無效,邏輯複製將不會繼續。此外,使用邏輯故障轉移槽的複製管理函式 pg_replication_slot_advancepg_logical_slot_get_changespg_logical_slot_peek_changes 將阻塞,直到所有指定的物理槽 synchronized_standby_slots 都確認收到 WAL。

對應於 synchronized_standby_slots 中物理複製槽的備用伺服器必須配置 sync_replication_slots = true,以便它們可以從主伺服器接收邏輯故障轉移槽更改。

19.6.2. 主伺服器 #

這些引數可以設定在要向一個或多個備用伺服器傳送複製資料的主伺服器上。請注意,除了這些引數之外,主伺服器上的 wal_level 必須設定正確,並且還可以選擇啟用 WAL 歸檔(參見第 19.5.3 節)。這些引數在備用伺服器上的值無關緊要,儘管您可能希望在那裡設定它們,以備備用伺服器成為主伺服器的可能性。

synchronous_standby_namesstring #

指定支援同步複製的備用伺服器列表,如第 26.2.8 節中所述。將有一個或多個活動的同步備用伺服器;在這些備用伺服器確認接收到其資料後,等待提交的事務將被允許繼續。同步備用伺服器將是那些名稱出現在此列表中的伺服器,並且它們當前已連線並正在即時流式傳輸資料(如在 pg_stat_replication 檢視中狀態為 streaming 所示)。指定多個同步備用伺服器可以實現非常高的可用性和資料丟失防護。

用於此目的的備用伺服器名稱是備用伺服器的 application_name 設定,如備用伺服器的連線資訊中所設定。對於物理複製備用伺服器,應在 primary_conninfo 設定中進行設定;預設是 cluster_name 的設定(如果已設定),否則為 walreceiver。對於邏輯複製,可以在訂閱的連線資訊中進行設定,預設為訂閱名稱。對於其他複製流消費者,請查閱其文件。

此引數指定備用伺服器列表,使用以下任一語法:

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]

其中 num_sync 是事務需要等待回覆的同步備用伺服器數量,而 standby_name 是備用伺服器的名稱。num_sync 必須是大於零的整數值。FIRSTANY 指定了從列表中伺服器中選擇同步備用伺服器的方法。

關鍵字 FIRST 加上 num_sync,指定基於優先順序的同步複製,並使事務提交等待,直到其 WAL 記錄被複制到從備用伺服器 s1s2s3s4 中選擇的 num_sync 個同步備用伺服器。列表中名稱出現較早的備用伺服器具有更高的優先順序,並將被視為同步。此列表中稍後出現的其他備用伺服器代表潛在的同步備用伺服器。如果當前任何同步備用伺服器因任何原因斷開連線,它將立即被下一個優先順序最高的備用伺服器替換。關鍵字 FIRST 是可選的。

關鍵字 ANY 加上 num_sync,指定基於法定人數的同步複製,並使事務提交等待,直到其 WAL 記錄被複制到至少 num_sync 個列出的備用伺服器。ANY 3 (s1, s2, s3, s4) 的示例將導致每次提交在收到 s1s2s3s4 中任何三個備用伺服器的回覆後即可繼續。

FIRSTANY 忽略大小寫。如果這些關鍵字作為備用伺服器的名稱使用,則其 standby_name 必須用雙引號括起來。

第三種語法在PostgreSQL 9.6 版本之前使用,並且仍然支援。它與第一種語法相同,只是 FIRSTnum_sync 等於 1。例如,FIRST 1 (s1, s2)s1, s2 具有相同的含義:s1s2 中的一個被選為同步備用伺服器。

特殊條目 * 匹配任何備用伺服器名稱。

沒有機制來強制備用伺服器名稱的唯一性。如果存在重複項,則其中一個匹配的備用伺服器將被認為具有更高的優先順序,儘管具體是哪一個是不確定的。

注意

每個 standby_name 應採用有效的 SQL 識別符號的形式,除非它是 *。如有必要,可以使用雙引號。但請注意,standby_name 與備用應用程式名稱的比較是忽略大小寫的,無論是否使用雙引號。

如果未在此處指定同步備用伺服器名稱,則不啟用同步複製,事務提交將不會等待複製。這是預設配置。即使啟用了同步複製,也可以透過將 synchronous_commit 引數設定為 localoff 來配置單個事務不等待複製。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

19.6.3. 備用伺服器 #

這些設定控制要接收復制資料的備用伺服器的行為。它們在主伺服器上的值無關緊要。

primary_conninfostring #

指定備用伺服器用於連線傳送伺服器的連線字串。此字串的格式如第 32.1.1 節中所述。如果此字串中未指定任何選項,則將檢查相應的環境變數(參見第 32.15 節)。如果環境變數也沒有設定,則使用預設值。

連線字串應指定傳送伺服器的主機名(或地址),以及埠號(如果與備用伺服器的預設埠號不同)。還要指定一個與傳送伺服器上具有適當許可權的角色對應的使用者名稱(參見第 26.2.5.1 節)。如果傳送方要求密碼認證,則還需要提供密碼。可以在 primary_conninfo 字串或備用伺服器上的單獨 ~/.pgpass 檔案中提供密碼(資料庫名稱使用 replication)。

對於複製槽同步(參見第 47.2.3 節),還必須在 primary_conninfo 字串中指定有效的 dbname。這僅用於槽同步。它會被流複製忽略。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。如果 WAL 接收器程序正在執行時更改此引數,則會向該程序傳送關閉訊號,並期望其使用新設定重新啟動(除非 primary_conninfo 為空字串)。如果伺服器未處於備用模式,則此設定無效。

primary_slot_namestring #

可選地指定一個現有的複製槽,在透過流複製連線到傳送伺服器時使用,以控制上游節點上的資源移除(參見第 26.2.6 節)。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。如果 WAL 接收器程序正在執行時更改此引數,則會向該程序傳送關閉訊號,並期望其使用新設定重新啟動。如果 primary_conninfo 未設定或伺服器未處於備用模式,則此設定無效。

hot_standbyboolean #

指定在恢復期間是否可以連線和執行查詢(如第 26.4 節中所述)。預設值為 on。此引數只能在伺服器啟動時設定。它僅在歸檔恢復或備用模式下有效。

max_standby_archive_delayinteger #

當熱備用處於活動狀態時,此引數決定備用伺服器在取消與即將應用的 WAL 條目衝突的備用查詢之前應等待多長時間(如第 26.4.2 節中所述)。max_standby_archive_delay 適用於 WAL 資料從 WAL 歸檔讀取時(因此不是最新的)。如果未指定單位,則此值被視為毫秒。預設值為 30 秒。值為 -1 允許備用伺服器無限期等待衝突查詢完成。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

請注意,max_standby_archive_delay 與查詢在取消前可以執行的最大時間不同;而是應用於一個 WAL 段的資料的最大允許總時間。因此,如果一個查詢在 WAL 段早期導致了顯著延遲,後續的衝突查詢將只有很短的寬限期。

max_standby_streaming_delayinteger #

當熱備用處於活動狀態時,此引數決定備用伺服器在取消與即將應用的 WAL 條目衝突的備用查詢之前應等待多長時間(如第 26.4.2 節中所述)。max_standby_streaming_delay 適用於透過流複製接收 WAL 資料時。如果未指定單位,則此值被視為毫秒。預設值為 30 秒。值為 -1 允許備用伺服器無限期等待衝突查詢完成。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

請注意,max_standby_streaming_delay 與查詢在取消前可以執行的最大時間不同;而是 WAL 資料從主伺服器接收後允許應用的最大總時間。因此,如果一個查詢導致了顯著延遲,後續的衝突查詢將有很短的寬限期,直到備用伺服器再次趕上。

wal_receiver_create_temp_slotboolean #

指定在未配置永久複製槽(使用 primary_slot_name)時,WAL 接收器程序是否應在遠端例項上建立臨時複製槽。預設值為 off。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。如果 WAL 接收器程序正在執行時更改此引數,則會向該程序傳送關閉訊號,並期望其使用新設定重新啟動。

wal_receiver_status_intervalinteger #

指定備用伺服器上的 WAL 接收器程序向主伺服器或上游備用伺服器傳送複製進度資訊的最小頻率,這些資訊可以在 pg_stat_replication 檢視中使用。備用伺服器將報告其已寫入的最後一個寫入預寫日誌位置、已重新整理到磁碟的最後一個位置以及已應用的最後一個位置。此引數的值是報告之間的最大時間間隔。更新將在寫入或重新整理位置更改時傳送,或者如果設定為非零值,則按照此引數指定的頻率傳送。還有其他情況會發送更新而不考慮此引數;例如,在現有 WAL 處理完成時,或當 synchronous_commit 設定為 remote_apply 時。因此,應用位置可能略微落後於真實位置。如果未指定單位,則此值被視為秒。預設值為 10 秒。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

hot_standby_feedbackboolean #

指定熱備用是否將當前在備用伺服器上執行的查詢的反饋傳送到主伺服器或上游備用伺服器。此引數可用於消除由清理記錄引起的查詢取消,但可能導致主伺服器上的資料庫膨脹,具體取決於某些工作負載。反饋訊息的傳送頻率不會超過每 wal_receiver_status_interval。預設值為 off。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

如果使用級聯複製,則反饋會向上遊傳遞,直到最終到達主伺服器。備用伺服器除了將收到的反饋傳遞給上游外,不會做其他任何使用。如果級聯複製正在使用,則反饋會向上遊傳遞,直到最終到達主伺服器。備用伺服器除了將收到的反饋傳遞給上游外,不會做其他任何使用。

請注意,如果備用伺服器上的時鐘向前或向後移動,反饋訊息可能不會在所需的時間間隔內傳送。在極端情況下,這可能導致主伺服器上死行移除的風險長時間存在,因為反饋機制基於時間戳。

wal_receiver_timeoutinteger #

終止不活動時間超過此持續時間的複製連線。這對於接收備用伺服器檢測主節點崩潰或網路中斷非常有用。如果未指定單位,則此值被視為毫秒。預設值為 60 秒。值為零停用超時機制。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

wal_retrieve_retry_intervalinteger #

指定備用伺服器在 WAL 資料不可用(來自流複製、本地 pg_wal 或 WAL 歸檔)後,在再次嘗試檢索 WAL 資料之前等待的時間。如果未指定單位,則此值被視為毫秒。預設值為 5 秒。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

此引數對於需要控制等待新 WAL 資料可用時間的恢復節點配置很有用。例如,在歸檔恢復中,可以透過減小此引數的值來提高恢復對新 WAL 檔案的檢測響應速度。在 WAL 活動較低的系統上,增加此值可以減少訪問 WAL 歸檔的請求次數,這在計費次數計入基礎設施訪問次數的雲環境中尤其有用。

在邏輯複製中,此引數也限制了失敗的複製應用工作程序或表同步工作程序的重新生成頻率。

recovery_min_apply_delayinteger #

預設情況下,備用伺服器會盡快恢復來自發送伺服器的 WAL 記錄。擁有一個延遲複製的資料副本可能很有用,這提供了糾正資料丟失錯誤的機會。此引數允許您按指定的時間量延遲恢復。例如,如果將此引數設定為 5min,則備用伺服器將在系統時間比主伺服器報告的提交時間晚至少五分鐘時,才回放每個事務提交。如果未指定單位,則此值被視為毫秒。預設值為零,不增加延遲。

複製延遲可能超過此引數的值,在這種情況下不會新增延遲。請注意,延遲是在主伺服器上寫入的 WAL 時間戳和備用伺服器上的當前時間之間計算的。由於網路延遲或級聯複製配置導致的傳輸延遲可能會顯著減小實際等待時間。如果主伺服器和備用伺服器的系統時鐘不同步,這可能會導致恢復比預期更早地應用記錄;但這並不是一個主要問題,因為此引數的有用設定遠大於伺服器之間的典型時間偏差。

延遲僅發生在事務提交的 WAL 記錄上。其他記錄會盡快回放,這不成問題,因為 MVCC 可見性規則確保在應用相應的提交記錄之前,它們的效果不會顯現。

延遲發生在恢復中的資料庫達到一致狀態後,直到備用伺服器被提升或觸發。之後,備用伺服器將結束恢復,不再等待。

WAL 記錄必須儲存在備用伺服器上,直到它們準備好被應用。因此,更長的延遲將導致 WAL 檔案累積更多,從而增加備用伺服器 pg_wal 目錄的磁碟空間需求。

此引數用於流複製部署;但是,如果指定了該引數,則除了崩潰恢復外,在所有情況下都會受到尊重。hot_standby_feedback 會因使用此功能而延遲,這可能導致主伺服器膨脹;請謹慎一起使用。

警告

同步複製受此設定的影響,當 synchronous_commit 設定為 remote_apply 時;每個 COMMIT 都需要等待應用。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

sync_replication_slotsboolean #

它使物理備用伺服器能夠從主伺服器同步邏輯故障轉移槽,以便邏輯訂閱者可以在故障轉移後從新主伺服器恢復複製。

預設情況下它是停用的。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

19.6.4. 訂閱者 #

這些設定控制邏輯複製訂閱者的行為。它們在釋出者上的值無關緊要。有關更多詳細資訊,請參閱第 29.12 節

max_active_replication_originsinteger #

指定同時可以跟蹤多少個複製源(參見第 48 章),有效限制了伺服器上可以建立的邏輯複製訂閱的數量。將其設定為低於當前跟蹤的複製源數量(反映在 pg_replication_origin_status 中)將阻止伺服器啟動。它預設為 10。此引數只能在伺服器啟動時設定。max_active_replication_origins 必須至少設定為要新增到訂閱者的訂閱數量,再加上一些用於表同步的預留。

max_logical_replication_workersinteger #

指定邏輯複製工作程序的最大數量。這包括主應用工作程序、並行應用工作程序和表同步工作程序。

邏輯複製工作程序從 max_worker_processes 定義的池中獲取。

預設值為 4。此引數只能在伺服器啟動時設定。

max_sync_workers_per_subscriptioninteger #

每個訂閱的最大同步工作程序數。此引數控制訂閱初始化期間或新增新表時初始資料複製的並行度。

目前,每個表只能有一個同步工作程序。

同步工作程序從 max_logical_replication_workers 定義的池中獲取。

預設值為 2。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

max_parallel_apply_workers_per_subscriptioninteger #

每個訂閱的最大並行應用工作程序數。此引數控制訂閱引數 streaming = parallel 的進行中事務流的並行度。

並行應用工作程序從 max_logical_replication_workers 定義的池中獲取。

預設值為 2。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

提交更正

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