CREATE SUBSCRIPTION — 定義一個新的訂閱
CREATE SUBSCRIPTIONsubscription_name
CONNECTION 'conninfo
' PUBLICATIONpublication_name
[, ...] [ WITH (subscription_parameter
[=value
] [, ... ] ) ]
CREATE SUBSCRIPTION
加入一個新的邏輯複製訂閱。建立訂閱的使用者會成為該訂閱的擁有者。訂閱名稱必須與目前資料庫中任何現有訂閱的名稱不同。
一個訂閱代表與發布者的複製連線。因此,除了在本地目錄中加入定義外,此命令通常會在發布者上建立一個複製槽。
邏輯複製工作程序將會在執行此命令的交易提交時啟動,以複製新訂閱的資料,除非訂閱最初已停用。
要能夠建立訂閱,您必須擁有 pg_create_subscription
角色的權限,以及目前資料庫的 CREATE
權限。
subscription_name
#新訂閱的名稱。
CONNECTION 'conninfo
'
#定義如何連線到發布者資料庫的 libpq 連線字串。有關詳細資訊,請參閱第 32.1.1 節。
PUBLICATION publication_name
[, ...]
#要在發布者上訂閱的發布名稱。
WITH ( subscription_parameter
[= value
] [, ... ] )
#此子句指定訂閱的可選參數。
以下參數控制訂閱建立期間發生的情況
connect
(boolean
) #指定 CREATE SUBSCRIPTION
命令是否應連線到發布者。預設值為 true
。將此設定為 false
將強制將 create_slot
、enabled
和 copy_data
的值設為 false
。(您不能將 connect
設定為 false
與將 create_slot
、enabled
或 copy_data
設定為 true
結合使用。)
由於當此選項為 false
時不會建立連線,因此不會訂閱任何資料表。若要啟動複製,您必須手動建立複製槽、在需要時啟用故障轉移、啟用訂閱並重新整理訂閱。請參閱第 29.2.3 節 以取得範例。
create_slot
(boolean
) #指定命令是否應在發布者上建立複製槽。預設值為 true
。
如果設定為 false
,您有責任以其他方式建立發布者的槽。請參閱第 29.2.3 節 以取得範例。
enabled
(boolean
) #指定訂閱是否應主動複製,或是否僅應設定但不啟動。預設值為 true
。
slot_name
(string
) #要使用的發布者複製槽名稱。預設值是使用訂閱的名稱作為槽名稱。
將 slot_name
設定為 NONE
表示將沒有與訂閱關聯的複製槽。此類訂閱也必須將 enabled
和 create_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_subscription
的 subtwophasestate
欄位,以瞭解實際的兩階段狀態。
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 TABLES
或 FOR TABLES IN SCHEMA
,則無論其他運算式的定義為何,都會始終發布列。如果訂閱者是 15 之前的 PostgreSQL 版本,則在初始資料同步階段會忽略任何列篩選。在這種情況下,使用者可能需要考慮刪除任何與後續篩選不相容的初始複製資料。因為初始資料同步在複製現有表格資料時,不考慮發布的 publish
參數,因此可能會複製一些不會使用 DML 複製的列。請參閱 第 29.2.2 節 以取得範例。
不支援訂閱中有多個發布,其中同一個表格已使用不同的欄位清單發布。
我們允許指定不存在的發布,以便使用者稍後可以新增這些發布。這表示 pg_subscription
可以具有不存在的發布。
當使用 copy_data = true
和 origin = 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>);
建立一個訂閱到遠端伺服器,該伺服器複製發布 mypublication
和 insert_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 SUBSCRIPTION
是 PostgreSQL 擴充功能。
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步說明的地方,請使用此表單來回報文件問題。