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

建立訂閱

建立訂閱 — 定義新的訂閱

語法

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

說明

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

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

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

若要建立訂閱,您必須具備 pg_create_subscription 角色的權限,以及目前資料庫的 建立 權限。

有關訂閱和邏輯複製整體的更多資訊,請參閱 第 31.2 節第 31 章

參數

subscription_name #

新訂閱的名稱。

CONNECTION 'conninfo' #

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

PUBLICATION publication_name [, ...] #

要訂閱的發佈者上之刊物的名稱。

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

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

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

connect (布林) #

指定 CREATE SUBSCRIPTION 指令是否應連線至發佈者。預設為 true。將此設定為 false 會強制 create_slotenabledcopy_data 的值為 false。(您無法將 connect 設定為 false 與將 create_slotenabledcopy_data 設定為 true 搭配使用。)

由於在選項為 false 時未建立連線,因此不會訂閱任何資料表。若要啟動複製,您必須手動建立複製槽、啟用訂閱並更新訂閱。請參閱 第 31.2.3 節 以取得範例。

create_slot (布林) #

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

如果設定為 false,您有責任以其他方式建立發行者的槽。請參閱 第 31.2.3 節 了解範例。

enabled (布林值) #

指定訂閱是否應主動複製,或是否應只設定但尚未啟動。預設為 true

slot_name (字串) #

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

slot_name 設定為 NONE 表示訂閱不會與複製槽關聯。此類訂閱還必須將 enabledcreate_slot 設定為 false。當您稍後手動建立複製槽時使用此選項。請參閱 第 31.2.3 節 了解範例。

下列參數會控制訂閱在建立後之複製行為

binary (布林值) #

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

在執行跨版本複製時,發佈者可能會對某些資料類型有二進制傳送功能,但訂閱者卻沒有該類型的二進制接收功能。在這種情況下,資料傳輸將會失敗,且無法使用 binary 選項。

如果發佈者是 PostgreSQL 16 版之前的版本,則任何初始表格同步都會使用文字格式,即使 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 (布林值) #

如果為 true,所有複製動作都將以訂閱擁有者的身分執行。如果為 false,複製工作人員將以該表格擁有者的身分對每個表格執行動作。後者的組態通常安全得多;如需詳細資訊,請參閱 第 31.9 節。預設為 false

origin (字串) #

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

有關 copy_data = true 如何與 origin 參數互動的詳細資訊,請參閱 註解

在指定 布林值 類型的參數時,可以省略 = value 部分,這等於指定 TRUE

注意事項

請參閱 第 31.9 節,瞭解如何組態訂閱與發佈執行個體之間的存取控制。

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

建立連線至相同資料庫叢集的訂閱(例如,在相同叢集中的資料庫之間複製或在同一個資料庫內複製)僅會在複製槽未建立為同一指令的一部分時成功。否則,CREATE SUBSCRIPTION 呼叫會暫停。若要讓這項功能正常運作,請個別建立複製槽(使用函數 pg_create_logical_replication_slot,並使用外掛程式名稱 pgoutput),並使用參數 create_slot = false 建立訂閱。請參閱 第 31.2.3 節 的範例。這項限制是實作限制,可能會在未來的版本中解除。

如果發佈中的任何表格都有 WHERE 子句,則會評估為 false 或 null 的 expression 的列不會發佈。如果訂閱有多個發佈,其中相同的表格已使用不同的 WHERE 子句發佈,則當任何表達式(指涉該發佈作業)符合時,就會發佈列。在不同的 WHERE 子句的情況下,如果其中一個發佈沒有 WHERE 子句(指涉該發佈作業)或發佈已宣告為 FOR ALL TABLESFOR TABLES IN SCHEMA,則列會不論其他表達式的定義為何而永遠發佈。如果訂閱者是版本 15 之前的 PostgreSQL,則在初始資料同步階段會忽略任何列篩選。對於這種情況,使用者可能想要考慮刪除任何最初複製的資料,因為這些資料與後續的篩選不相容。由於初始資料同步在複製現有表格資料時不會考量發佈 publish 參數,因此可能會複製一些列,而這些列不會使用 DML 複製。請參閱 第 31.2.2 節 的範例。

不支援在多個刊物中發佈相同表格,但欄位清單不同的訂閱。

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

使用 copy_data = trueorigin = NONE 的訂閱參數組合時,初始同步表格資料會直接從發佈者複製,表示無法得知該資料的真實來源。如果發佈者也有訂閱,則複製的表格資料可能來自更上游。系統會偵測到此情境,並記錄警告訊息給使用者,但警告訊息僅表示潛在問題;使用者有責任進行必要的檢查,以確保複製資料的來源是否符合需求。

若要找出哪些表格可能包含非本機來源(由於在發佈者上建立其他訂閱),請嘗試使用此 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 擴充功能。

提交修正

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