2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17
開發版本: devel

pg_createsubscriber

pg_createsubscriber — 將物理副本轉換為新的邏輯副本

概要

pg_createsubscriber [選項...] { -d | --database }dbname { -D | --pgdata }datadir { -P | --publisher-server }connstr

描述

pg_createsubscriber 從物理備用伺服器建立一個新的邏輯副本。指定資料庫中的所有表都包含在 邏輯複製 設定中。為每個資料庫建立一對釋出物件和訂閱物件。它必須在目標伺服器上執行。

成功執行後,目標伺服器的狀態類似於全新的邏輯複製設定。邏輯複製設定和 pg_createsubscriber 之間的主要區別在於資料同步的方式。pg_createsubscriber 不會複製初始表資料。它只執行同步階段,這確保了每個表都達到同步狀態。

pg_createsubscriber 針對大型資料庫系統,因為在邏輯複製設定中,大部分時間都花在初始資料複製上。此外,花費大量時間同步資料的副作用通常是需要應用大量的更改(這些更改是在初始資料複製期間產生的),這進一步增加了邏輯副本可用所需的時間。對於小型資料庫,建議使用初始資料同步來設定邏輯複製。有關詳細資訊,請參閱 CREATE SUBSCRIPTIONcopy_data 選項。

選項

pg_createsubscriber 接受以下命令列引數

-a
--all

在目標伺服器上為每個資料庫建立一個訂閱。模板資料庫和不允許連線的資料庫除外。要發現所有資料庫的列表,請使用 --publisher-server 連線字串中指定的資料庫名稱連線到源伺服器,或者如果未指定,則使用 postgres 資料庫,或者如果不存在,則使用 template1 資料庫。指定此選項時,將使用自動生成的訂閱、釋出和複製槽名稱。此選項不能與 --database--publication--replication-slot--subscription 一起使用。

-d dbname
--database=dbname

建立訂閱的資料庫名稱。可以透過編寫多個 -d 開關來選擇多個數據庫。此選項不能與 -a 一起使用。如果未提供 -d 選項,則資料庫名稱將從 -P 選項中獲取。如果資料庫名稱未在 -d 選項或 -P 選項中指定,並且未指定 -a 選項,則會報告錯誤。

-D directory
--pgdata=directory

包含來自物理副本的叢集目錄的目標目錄。

-n
--dry-run

執行所有操作,但實際上不修改目標目錄。

-p port
--subscriber-port=port

目標伺服器監聽連線的埠號。預設為在埠 50432 上執行目標伺服器,以避免意外的客戶端連線。

-P connstr
--publisher-server=connstr

到釋出者的連線字串。有關詳細資訊,請參閱 第 32.1.1 節

-s dir
--socketdir=dir

用於目標伺服器上的 postmaster 套接字的目錄。預設值為當前目錄。

-t seconds
--recovery-timeout=seconds

等待恢復結束的最長秒數。設定為 0 則停用。預設值為 0。

-T
--enable-two-phase

為訂閱啟用 two_phase 提交。當指定多個數據庫時,此選項統一應用於在這些資料庫上建立的所有訂閱。預設值為 false

-U username
--subscriber-username=username

在目標伺服器上連線的使用者名稱。預設為當前作業系統使用者名稱。

-v
--verbose

啟用詳細模式。這將導致 pg_createsubscriber 將進度訊息和每個步驟的詳細資訊輸出到標準錯誤。重複使用該選項會導致其他除錯級別的訊息顯示在標準錯誤中。

--clean=objtype

從目標伺服器上的指定資料庫中刪除指定型別的​​所有物件。

  • publications:為該訂閱者建立的 FOR ALL TABLES 釋出總是被刪除;指定此物件型別會導致從源伺服器複製的所有其他釋出也被刪除。

要刪除的物件會單獨記錄,包括在 --dry-run 期間。沒有機會影響或停止刪除選定的物件,因此請考慮使用 pg_dump 備份它們。

--config-file=filename

為目標資料目錄使用指定的伺服器主配置檔案。pg_createsubscriber 內部使用 pg_ctl 命令啟動和停止目標伺服器。它允許您指定實際的 postgresql.conf 配置檔案,如果它儲存在資料目錄之外。

--publication=name

用於設定邏輯複製的釋出名稱。可以透過編寫多個 --publication 開關來指定多個釋出。釋出名稱的數量必須與指定的資料庫數量匹配,否則會報告錯誤。多個釋出名稱開關的順序必須與資料庫開關的順序匹配。如果未指定此選項,則為釋出名稱分配一個生成的名稱。此選項不能與 --all 一起使用。

--replication-slot=name

用於設定邏輯複製的複製槽名稱。可以透過編寫多個 --replication-slot 開關來指定多個複製槽。複製槽名稱的數量必須與指定的資料庫數量匹配,否則會報告錯誤。多個複製槽名稱開關的順序必須與資料庫開關的順序匹配。如果未指定此選項,則將訂閱名稱分配給複製槽名稱。此選項不能與 --all 一起使用。

--subscription=name

用於設定邏輯複製的訂閱名稱。可以透過編寫多個 --subscription 開關來指定多個訂閱。訂閱名稱的數量必須與指定的資料庫數量匹配,否則會報告錯誤。多個訂閱名稱開關的順序必須與資料庫開關的順序匹配。如果未指定此選項,則為訂閱名稱分配一個生成的名稱。此選項不能與 --all 一起使用。

-V
--version

列印 pg_createsubscriber 版本並退出。

-?
--help

顯示關於 pg_createsubscriber 命令列引數的幫助資訊,然後退出。

註釋

先決條件

pg_createsubscriber 將目標伺服器轉換為邏輯副本需要滿足一些先決條件。如果未滿足這些條件,將報告錯誤。源伺服器和目標伺服器的主版本必須與 pg_createsubscriber 相同。給定的目標資料目錄必須與源資料目錄具有相同的系統識別符號。給定的目標資料目錄的使用者必須具有建立 訂閱 和使用 pg_replication_origin_advance() 的許可權。

目標伺服器必須用作物理備用伺服器。max_active_replication_originsmax_logical_replication_workers 的配置值必須大於或等於指定資料庫的數量。目標伺服器的 max_worker_processes 配置值必須大於指定資料庫的數量。目標伺服器必須接受本地連線。如果您計劃使用 --enable-two-phase 開關,您還需要適當設定 max_prepared_transactions

源伺服器必須接受來自目標伺服器的連線。源伺服器不得處於恢復模式。wal_level 必須設定為 logical。源伺服器的 max_replication_slots 配置值必須大於或等於指定資料庫的數量加上現有的複製槽數量。源伺服器的 max_wal_senders 配置值必須大於或等於指定資料庫的數量加上現有的 WAL 傳送器程序數量。

警告

如果 pg_createsubscriber 在目標伺服器已提升為主伺服器後失敗,則資料目錄很可能處於無法恢復的狀態。在這種情況下,建議建立一個新的備用伺服器。

pg_createsubscriber 在轉換過程中通常會使用不同的連線設定來啟動目標伺服器。因此,對目標伺服器的連線應該會失敗。

由於 DDL 命令不由邏輯複製複製,因此在執行 pg_createsubscriber 時,請避免執行更改資料庫模式的 DDL 命令。如果目標伺服器已被轉換為邏輯副本,DDL 命令可能不會被複制,這可能會導致錯誤。

如果 pg_createsubscriber 在處理過程中失敗,則在源伺服器上建立的物件(釋出、複製槽)將被刪除。如果目標伺服器無法連線到源伺服器,刪除可能會失敗。在這種情況下,警告訊息將通知保留的物件。如果目標伺服器正在執行,它將被停止。

如果複製正在使用 primary_slot_name,它將在邏輯複製設定後從源伺服器中刪除。

如果目標伺服器是同步備用伺服器,則在執行 pg_createsubscriber 時,主伺服器上的事務提交可能會等待複製。

除非指定了 --enable-two-phase 開關,否則 pg_createsubscriber 會設定不啟用兩階段提交的邏輯複製。這意味著任何預備事務將在 COMMIT PREPARED 時被複制,而無需提前準備。設定完成後,您可以手動刪除並重新建立訂閱,並啟用 two_phase 選項。

pg_createsubscriber 使用 pg_resetwal 更改系統識別符號。這將避免目標伺服器使用源伺服器的 WAL 檔案的情況。如果目標伺服器有備用伺服器,複製將會中斷,應該建立一個新的備用伺服器。

如果所需的 WAL 檔案丟失,可能會發生複製失敗。為防止這種情況,源伺服器必須將 max_slot_wal_keep_size 設定為 -1,以確保不會過早刪除必需的 WAL 檔案。

工作原理

基本思路是有一個來自源伺服器的複製起點,並設定一個從該起點開始的邏輯複製。

  1. 使用指定的命令列選項啟動目標伺服器。如果目標伺服器已在執行,pg_createsubscriber 將以錯誤終止。

  2. 檢查目標伺服器是否可以轉換。對源伺服器也有一些檢查。如果任何先決條件未滿足,pg_createsubscriber 將以錯誤終止。

  3. 在源伺服器上為每個指定的資料庫建立一個釋出和複製槽。每個釋出都是使用 FOR ALL TABLES 建立的。如果未指定 --publication 選項,則釋出具有以下名稱模式:pg_createsubscriber_%u_%x(引數:資料庫 oid,隨機 int)。如果未指定 --replication-slot 選項,則複製槽具有以下名稱模式:pg_createsubscriber_%u_%x(引數:資料庫 oid,隨機 int)。這些複製槽將在後續步驟中由訂閱使用。最後一個複製槽 LSN 用作 recovery_target_lsn 引數中的停止點,並作為訂閱的複製起點。它保證不會丟失任何事務。

  4. 將恢復引數寫入目標資料目錄並重新啟動目標伺服器。它指定一個 LSN(recovery_target_lsn),表示恢復將進行到的寫前日誌位置。它還將 promote 指定為伺服器達到恢復目標後應採取的操作。添加了額外的 恢復引數,以避免在恢復過程中出現意外行為,例如一旦達到一致狀態就結束恢復(WAL 應應用到複製起點位置)以及可能導致失敗的多個恢復目標。此步驟在伺服器結束備用模式並接受讀寫事務後完成。如果設定了 --recovery-timeout 選項,如果恢復未在給定的秒數內結束,pg_createsubscriber 將終止。

  5. 在目標伺服器上為每個指定的資料庫建立一個訂閱。如果未指定 --subscription 選項,則訂閱具有以下名稱模式:pg_createsubscriber_%u_%x(引數:資料庫 oid,隨機 int)。它不從源伺服器複製現有資料。它不建立複製槽。而是使用上一步建立的複製槽。訂閱已被建立,但尚未啟用。原因是必須在開始複製之前將複製進度設定為複製起點。

  6. 刪除目標伺服器上已複製的釋出,因為它們是在複製起點之前建立的。它在訂閱者上沒有用。

  7. 將每個訂閱的複製進度設定為複製起點。當目標伺服器啟動恢復過程時,它會趕上覆制起點。這是每個訂閱的初始複製位置的確切 LSN。複製原點名稱是在建立訂閱時獲得的。複製原點名稱和複製起點在 pg_replication_origin_advance() 中用於設定初始複製位置。

  8. 為目標伺服器上的每個指定資料庫啟用訂閱。訂閱將從複製起點開始應用事務。

  9. 如果備用伺服器正在使用 primary_slot_name,則從現在起將不再使用它,因此將其刪除。

  10. 如果備用伺服器包含 故障轉移複製槽,則它們無法再同步,因此將它們刪除。

  11. 更新目標伺服器上的系統識別符號。將執行 pg_resetwal 來修改系統識別符號。目標伺服器將根據 pg_resetwal 的要求停止。

示例

要從物理副本 foo 為資料庫 hrfinance 建立邏輯副本

$ pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance

另請參閱

pg_basebackup

提交更正

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