支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10

CREATE SUBSCRIPTION

CREATE SUBSCRIPTION — 定義一個新的訂閱

概要

CREATE SUBSCRIPTION subscription_name
    CONNECTION 'conninfo'
    PUBLICATION publication_name [, ...]
    [ WITH ( subscription_parameter [= value] [, ... ] ) ]

描述

CREATE SUBSCRIPTION 加入一個新的邏輯複製訂閱。建立訂閱的使用者會成為該訂閱的擁有者。訂閱名稱必須與目前資料庫中任何現有訂閱的名稱不同。

一個訂閱代表與發布者的複製連線。因此,除了在本地目錄中加入定義外,此命令通常會在發布者上建立一個複製槽。

邏輯複製工作程序將會在執行此命令的交易提交時啟動,以複製新訂閱的資料,除非訂閱最初已停用。

要能夠建立訂閱,您必須擁有 pg_create_subscription 角色的權限,以及目前資料庫的 CREATE 權限。

有關訂閱和整個邏輯複製的其他資訊,請參閱第 29.2 節第 29 章

參數

subscription_name #

新訂閱的名稱。

CONNECTION 'conninfo' #

定義如何連線到發布者資料庫的 libpq 連線字串。有關詳細資訊,請參閱第 32.1.1 節

PUBLICATION publication_name [, ...] #

要在發布者上訂閱的發布名稱。

WITH ( subscription_parameter [= value] [, ... ] ) #

此子句指定訂閱的可選參數。

以下參數控制訂閱建立期間發生的情況

connect (boolean) #

指定 CREATE SUBSCRIPTION 命令是否應連線到發布者。預設值為 true。將此設定為 false 將強制將 create_slotenabledcopy_data 的值設為 false。(您不能將 connect 設定為 false 與將 create_slotenabledcopy_data 設定為 true 結合使用。)

由於當此選項為 false 時不會建立連線,因此不會訂閱任何資料表。若要啟動複製,您必須手動建立複製槽、在需要時啟用故障轉移、啟用訂閱並重新整理訂閱。請參閱第 29.2.3 節 以取得範例。

create_slot (boolean) #

指定命令是否應在發布者上建立複製槽。預設值為 true

如果設定為 false,您有責任以其他方式建立發布者的槽。請參閱第 29.2.3 節 以取得範例。

enabled (boolean) #

指定訂閱是否應主動複製,或是否僅應設定但不啟動。預設值為 true

slot_name (string) #

要使用的發布者複製槽名稱。預設值是使用訂閱的名稱作為槽名稱。

slot_name 設定為 NONE 表示將沒有與訂閱關聯的複製槽。此類訂閱也必須將 enabledcreate_slot 都設定為 false。如果您稍後將手動建立複製槽,請使用此設定。請參閱第 29.2.3 節 以取得範例。

當將 slot_name 設定為有效名稱且將 create_slot 設定為 false 時,命名槽的 failover 屬性值可能與訂閱中指定的對應 failover 參數不同。請務必確保槽屬性 failover 與訂閱的對應參數相符,反之亦然。否則,發布者上的槽行為可能與這些訂閱選項所說的不同:例如,即使訂閱的 failover 選項已停用,發布者上的槽也可以同步到備用伺服器,或者即使訂閱的 failover 選項已啟用,也可以停用同步。

以下參數控制訂閱建立後訂閱的複製行為

binary (boolean) #

指定訂閱是否會要求發布者以二進位格式(而不是文字)傳送資料。預設值為 false。任何初始資料表同步複製(請參閱 copy_data)也會使用相同的格式。二進位格式可能比文字格式快,但在機器架構和 PostgreSQL 版本之間的可移植性較差。二進位格式非常特定於資料類型;例如,它不允許從 smallint 欄位複製到 integer 欄位,即使在文字格式中可以正常運作。即使啟用此選項,也只有具有二進位傳送和接收函數的資料類型才會以二進位傳輸。請注意,初始同步要求所有資料類型都具有二進位傳送和接收函數,否則同步將失敗(有關傳送/接收函數的更多資訊,請參閱CREATE TYPE)。

當進行跨版本複製時,發布者可能對某些資料類型具有二進位傳送函式,但訂閱者缺少該類型的二進位接收函式。 在這種情況下,資料傳輸將會失敗,並且無法使用 binary 選項。

如果發布者是 16 之前的 PostgreSQL 版本,即使 binary = true,任何初始表格同步都將使用文字格式。

copy_data (boolean) #

指定在開始複製時,是否複製訂閱中所包含的發布中已存在的資料。 預設值為 true

如果發布包含 WHERE 子句,它將影響複製的資料。 有關詳細訊息,請參閱注意事項

有關 copy_data = true 如何與 origin 參數互動的詳細訊息,請參閱注意事項

streaming (enum) #

指定是否為此訂閱啟用進行中交易的串流。 預設值為 off,表示所有交易都在發布者上完全解碼,然後才作為整體傳送到訂閱者。

如果設定為 on,則傳入的變更會寫入暫存檔案,並且僅在交易在發布者上提交並由訂閱者接收後才套用。

如果設定為 parallel,則傳入的變更會透過其中一個平行套用工作程序直接套用(如果可用)。 如果沒有平行套用工作程序可以處理串流交易,則變更會寫入暫存檔案,並在交易提交後套用。 請注意,如果平行套用工作程序中發生錯誤,則可能不會在伺服器日誌中報告遠端交易的完成 LSN。

synchronous_commit (enum) #

此參數的值會覆寫此訂閱的套用工作程序中的 synchronous_commit 設定。 預設值為 off

對於邏輯複製,使用 off 是安全的:如果訂閱者因為缺少同步而遺失交易,資料將會從發布者重新傳送。

在進行同步邏輯複製時,可能需要不同的設定。 邏輯複製工作程序會將寫入和刷新的位置報告給發布者,並且在使用同步複製時,發布者將等待實際的刷新。 這表示當訂閱用於同步複製時,將訂閱者的 synchronous_commit 設定為 off 可能會增加發布者上 COMMIT 的延遲。 在這種情況下,將 synchronous_commit 設定為 local 或更高可能是有利的。

two_phase (boolean) #

指定是否為此訂閱啟用兩階段提交。 預設值為 false

啟用兩階段提交後,準備好的交易會在 PREPARE TRANSACTION 時傳送到訂閱者,並且也會在訂閱者上作為兩階段交易處理。 否則,準備好的交易僅在提交時才傳送到訂閱者,然後由訂閱者立即處理。

兩階段提交的實作需要複製已成功完成初始表格同步階段。 因此,即使為訂閱啟用了 two_phase,內部兩階段狀態也會暫時保持為 pending,直到初始化階段完成。 請參閱 pg_subscriptionsubtwophasestate 欄位,以瞭解實際的兩階段狀態。

disable_on_error (boolean) #

指定如果在從發布者複製資料期間,訂閱工作程序偵測到任何錯誤,是否應自動停用訂閱。 預設值為 false

password_required (boolean) #

如果設定為 true,則作為此訂閱結果而與發布者建立的連線必須使用密碼驗證,並且密碼必須指定為連線字串的一部分。 當訂閱的所有者是超級使用者時,此設定將被忽略。 預設值為 true。 只有超級使用者可以將此值設定為 false

run_as_owner (boolean) #

如果為 true,所有複製動作都將以訂閱所有者的身分執行。 如果為 false,複製工作程序將以每個表格的所有者的身分對表格執行動作。 後者配置通常更安全;有關詳細訊息,請參閱第 29.10 節。 預設值為 false

origin (string) #

指定訂閱是否將請求發布者僅傳送沒有來源的變更,或傳送不論來源的變更。 將 origin 設定為 none 表示訂閱將請求發布者僅傳送沒有來源的變更。 將 origin 設定為 any 表示發布者會傳送不論其來源的變更。 預設值為 any

有關 copy_data = true 如何與 origin 參數互動的詳細訊息,請參閱注意事項

failover (boolean) #

指定是否啟用與訂閱關聯的複製槽,以便將邏輯複製槽同步到備用伺服器,以便在容錯移轉後從新的主要伺服器恢復邏輯複製。 預設值為 false

當指定 boolean 類型的參數時,可以省略 = value 部分,這相當於指定 TRUE

注意事項

有關如何在訂閱和發布執行個體之間設定存取控制的詳細訊息,請參閱第 29.10 節

建立複製槽(預設行為)時,無法在交易區塊內執行 CREATE SUBSCRIPTION

如果建立一個連線到相同資料庫叢集的訂閱 (例如,在相同叢集中的資料庫之間複製,或在同一個資料庫內複製),只有在複製槽不是作為相同指令的一部分建立時,才會成功。否則,CREATE SUBSCRIPTION 呼叫將會停滯。為了讓這個方法可行,請分別建立複製槽 (使用函數 pg_create_logical_replication_slot,並使用外掛程式名稱 pgoutput),並使用參數 create_slot = false 建立訂閱。請參閱 第 29.2.3 節 以取得範例。這是一個實作上的限制,未來版本可能會解除。

如果發布中的任何表格具有 WHERE 子句,則 expression 評估為 false 或 null 的列將不會發布。如果訂閱中有多個發布,其中同一個表格已使用不同的 WHERE 子句發布,則只要滿足任何一個運算式 (參考該發布操作),就會發布該列。在不同的 WHERE 子句的情況下,如果其中一個發布沒有 WHERE 子句 (參考該發布操作),或者該發布宣告為 FOR ALL TABLESFOR TABLES IN SCHEMA,則無論其他運算式的定義為何,都會始終發布列。如果訂閱者是 15 之前的 PostgreSQL 版本,則在初始資料同步階段會忽略任何列篩選。在這種情況下,使用者可能需要考慮刪除任何與後續篩選不相容的初始複製資料。因為初始資料同步在複製現有表格資料時,不考慮發布的 publish 參數,因此可能會複製一些不會使用 DML 複製的列。請參閱 第 29.2.2 節 以取得範例。

不支援訂閱中有多個發布,其中同一個表格已使用不同的欄位清單發布。

我們允許指定不存在的發布,以便使用者稍後可以新增這些發布。這表示 pg_subscription 可以具有不存在的發布。

當使用 copy_data = trueorigin = NONE 的訂閱參數組合時,初始同步表格資料會直接從發布者複製,這表示無法得知該資料的真實來源。如果發布者也有訂閱,則複製的表格資料可能源自更上游。偵測到這種情況時,會向使用者記錄一個 WARNING,但該警告僅表示存在潛在問題;使用者有責任進行必要的檢查,以確保複製的資料來源確實符合預期。

若要找出哪些表格可能包含非本機來源 (由於在發布者上建立的其他訂閱),請嘗試此 SQL 查詢

# substitute <pub-names> below with your publication name(s) to be queried
SELECT DISTINCT PT.schemaname, PT.tablename
FROM pg_publication_tables PT,
     pg_subscription_rel PS
     JOIN pg_class C ON (C.oid = PS.srrelid)
     JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE N.nspname = PT.schemaname AND
      C.relname = PT.tablename AND
      PT.pubname IN (<pub-names>);

範例

建立一個訂閱到遠端伺服器,該伺服器複製發布 mypublicationinsert_only 中的表格,並在提交時立即開始複製

CREATE SUBSCRIPTION mysub
         CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
        PUBLICATION mypublication, insert_only;

建立一個訂閱到遠端伺服器,該伺服器複製 insert_only 發布中的表格,並且在稍後啟用時才會開始複製。

CREATE SUBSCRIPTION mysub
         CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
        PUBLICATION insert_only
               WITH (enabled = false);

相容性

CREATE SUBSCRIPTIONPostgreSQL 擴充功能。

提交更正

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