全部產品
Search
文件中心

PolarDB:CREATE SUBSCRIPTION

更新時間:Jul 06, 2024

CREATE SUBSCRIPTION用於為當前資料庫添加一個新的訂閱。

簡介

CREATE SUBSCRIPTION為當前資料庫添加一個新的訂閱。 訂閱名稱必須與資料庫中任何現有的訂閱不同。

訂閱表示到發行者的複製串連。因此,此命令不僅在本地目錄中添加定義,還會在發行者上建立複製插槽。在運行此命令的事務提交時,將啟動邏輯複製工作器以複製新訂閱的資料。

文法

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

參數

subscription_name新訂閱的名稱。

CONNECTION ' conninfo '串連發行者的字串。

PUBLICATION publication_name要訂閱的發行者上的發布名稱。

WITH ( subscription_parameter [= value ] [, ... ] )該子句指定訂閱的選擇性參數。支援的參數有:

copy_data (boolean)指定在複製啟動後是否應複製正在訂閱的發布中的現有資料。 預設值是true

create_slot (boolean)指定該命令是否要在發行者上建立複製槽。預設值是true

enabled (boolean)指定訂閱是否應該主動複製,或者是否應該只是設定,但尚未啟動。 預設值是true

slot_name (string)要使用的複製插槽的名稱。預設行為是使用訂閱名稱作為插槽的名稱。

slot_name設定為NONE時, 將不會有複製槽與訂閱關聯。這在需要稍後手動設定複製槽的情況下會使用。 這樣的訂閱必須同時enabled並且 create_slot設定為false

synchronous_commit (enum)該參數的值會覆蓋 synchronous_commit 設定。 預設值是off

對於邏輯複製使用off是安全的: 如果訂閱者由於缺少同步而丟失事務,資料將從發行者再次發送。

進行同步邏輯複製時,不同的設定可能是合適的。 邏輯複製工作者向發行者報告寫入和重新整理的位置,當使用同步複製時, 發行者將等待實際重新整理。這意味著,當訂閱用於同步複製時, 將訂閱者的synchronous_commit設定為off 可能會增加發行伺服器上COMMIT的延遲。 在這種情況下,將synchronous_commit設定為 local或更高是有利的。

connect (boolean)指定CREATE SUBSCRIPTION是否應該串連到發行者。 將其設定為false將會改變預設值enabledcreate_slotcopy_datafalse

不允許將connect設定為false的同時將 enabledcreate_slotcopy_data 設定為true

因為該選項設定為false時不會建立串連, 因此表沒有被訂閱,所以當啟用訂閱後,不會複製任何內容。 需要運行ALTER SUBSCRIPTION ... REFRESH PUBLICATION才能訂閱表。

說明

建立複製槽時(預設行為), CREATE SUBSCRIPTION不能在事務塊內部執行。

如果複製插槽不是作為同一命令的一部分建立的,則建立串連到相同資料庫叢集的訂閱 (例如,在同一叢集中的資料庫之間進行複製或在同一個資料庫中進行複製)只能成功否則,CREATE SUBSCRIPTION調用將掛起。要做到這一點, 單獨建立複製插槽(使用函數pg_create_logical_replication_slot 和外掛程式名稱pgoutput),並使用參數create_slot = false 建立訂閱。這是一個實施限制,可能會在未來的版本中解除。

樣本

建立一個到遠程伺服器的訂閱,複製發布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);