支援的版本: 目前 (17)
開發版本: devel

pg_createsubscriber

pg_createsubscriber — 將實體副本轉換為新的邏輯副本

概要

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

描述

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

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

pg_createsubscriber 針對大型資料庫系統,因為在邏輯複製設定中,大部分時間都花在執行初始資料複製上。此外,這種長時間同步資料的副作用通常是要套用大量變更(在初始資料複製期間產生),這更加增加了邏輯副本可用的時間。對於較小的資料庫,建議使用 初始資料同步

選項

pg_createsubscriber 接受以下命令列引數

-d dbname
--database=dbname

要在其中建立訂閱的資料庫名稱。可以透過撰寫多個 -d 開關來選取多個資料庫。

-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 socket 的目錄。預設值為目前目錄。

-t seconds
--recovery-timeout=seconds

等待復原結束的最長時間(以秒為單位)。設定為 0 可停用。預設值為 0。

-U username
--subscriber-username=username

要以哪個使用者名稱連線到目標伺服器。預設值為目前的作業系統使用者名稱。

-v
--verbose

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

--config-file=filename

將指定的主要伺服器組態檔用於目標資料目錄。pg_createsubscriber 內部使用 pg_ctl 命令來啟動和停止目標伺服器。如果 postgresql.conf 組態檔儲存在資料目錄之外,則允許您指定實際的組態檔。

--publication=name

設定邏輯複製的發布名稱。可以透過撰寫多個 --publication 開關來指定多個發布。發布名稱的數量必須與指定的資料庫數量相符,否則會報告錯誤。多個發布名稱開關的順序必須與資料庫開關的順序相符。如果未指定此選項,則會將產生的名稱指派給發布名稱。

--replication-slot=name

設定邏輯複製的複製槽名稱。可以透過撰寫多個 --replication-slot 開關來指定多個複製槽。複製槽名稱的數量必須與指定的資料庫數量相符,否則會報告錯誤。多個複製槽名稱開關的順序必須與資料庫開關的順序相符。如果未指定此選項,則訂閱名稱會被指派給複製槽名稱。

--subscription=name

設定邏輯複製的訂閱名稱。可以透過撰寫多個 --subscription 開關來指定多個訂閱。訂閱名稱的數量必須與指定的資料庫數量相符,否則會報告錯誤。多個訂閱名稱開關的順序必須與資料庫開關的順序相符。如果未指定此選項,則會將產生的名稱指派給訂閱名稱。

-V
--version

列印 pg_createsubscriber 版本並結束。

-?
--help

顯示關於 pg_createsubscriber 命令列引數的說明,然後結束。

注意事項

先決條件

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

目標伺服器必須作為實體備援伺服器使用。目標伺服器必須將 max_replication_slotsmax_logical_replication_workers 設定為大於或等於指定資料庫數目的值。目標伺服器必須將 max_worker_processes 設定為大於指定資料庫數目的值。目標伺服器必須接受本機連線。

來源伺服器必須接受來自目標伺服器的連線。來源伺服器不得處於復原狀態。來源伺服器必須將 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 時,主伺服器上的交易提交可能會等待複寫。

pg_createsubscriber 設定了禁用兩階段提交的邏輯複寫。這表示任何準備好的交易都會在 COMMIT PREPARED 時進行複寫,而無需事先準備。設定完成後,您可以手動刪除並重新建立啟用 two_phase 選項的訂閱。

pg_createsubscriber 使用 pg_resetwal 變更系統識別碼。它會避免目標伺服器可能使用來自來源伺服器的 WAL 檔案的情況。如果目標伺服器有備援伺服器,則複寫將會中斷,並且應該建立新的備援伺服器。

運作方式

基本概念是從來源伺服器取得複寫起點,並設定從此起點開始的邏輯複寫

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

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

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

  4. 將復原參數寫入目標資料目錄並重新啟動目標伺服器。它指定了預寫式日誌位置的 LSN(recovery_target_lsn),復原將進行到該位置。它還指定了 promote 作為伺服器在達到復原目標後應採取的動作。新增了其他復原參數,以避免在復原過程中出現意外行為,例如在達到一致狀態後立即結束復原(應將 WAL 應用到複寫起始位置)以及可能導致失敗的多個復原目標。一旦伺服器結束備援模式並接受讀寫交易,此步驟即完成。如果設定了 --recovery-timeout 選項,則如果復原直到給定的秒數後仍未結束,pg_createsubscriber 將會終止。

  5. 在目標伺服器上為每個指定的資料庫建立訂閱。如果未指定 subscription-name,則訂閱具有以下名稱模式: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

提交更正

如果您在文件中發現任何不正確、與您對特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。