ALTER SUBSCRIPTION — 更改訂閱的定義
ALTER SUBSCRIPTIONnameCONNECTION 'conninfo' ALTER SUBSCRIPTIONnameSET PUBLICATIONpublication_name[, ...] [ WITH (publication_option[=value] [, ... ] ) ] ALTER SUBSCRIPTIONnameADD PUBLICATIONpublication_name[, ...] [ WITH (publication_option[=value] [, ... ] ) ] ALTER SUBSCRIPTIONnameDROP PUBLICATIONpublication_name[, ...] [ WITH (publication_option[=value] [, ... ] ) ] ALTER SUBSCRIPTIONnameREFRESH PUBLICATION [ WITH (refresh_option[=value] [, ... ] ) ] ALTER SUBSCRIPTIONnameENABLE ALTER SUBSCRIPTIONnameDISABLE ALTER SUBSCRIPTIONnameSET (subscription_parameter[=value] [, ... ] ) ALTER SUBSCRIPTIONnameSKIP (skip_option=value) ALTER SUBSCRIPTIONnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER SUBSCRIPTIONnameRENAME TOnew_name
ALTER SUBSCRIPTION 可以更改 CREATE SUBSCRIPTION 中可以指定的訂閱的大部分屬性。
要使用 ALTER SUBSCRIPTION,您必須擁有該訂閱。要重新命名訂閱或更改所有者,您必須對該資料庫擁有 CREATE 許可權。此外,要更改所有者,您必須能夠 SET ROLE 為新的所有者角色。如果訂閱的 password_required=false,則只有超級使用者才能修改它。
刷新發布時,我們會刪除不再屬於該釋出的關聯,並且還會刪除任何表同步槽。刪除這些槽是必要的,以便釋放遠端主機上為訂閱分配的資源。如果由於網路中斷或其他錯誤,PostgreSQL 無法刪除這些槽,則會報告錯誤。要在此情況下繼續操作,使用者需要重試操作,或將槽與訂閱解除關聯並刪除訂閱,具體方法請參見 DROP SUBSCRIPTION。
命令 ALTER SUBSCRIPTION ... REFRESH PUBLICATION、帶有 refresh 選項為 true 的 ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ...、ALTER SUBSCRIPTION ... SET (failover = true|false) 和 ALTER SUBSCRIPTION ... SET (two_phase = false) 不能在事務塊內執行。
帶有 refresh 選項為 true 的命令 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 和 ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ... 也不可在訂閱啟用 two_phase 提交時執行,除非 copy_data 為 false。請參見 pg_subscription 的 subtwophasestate 列以瞭解實際的兩階段提交狀態。
name #要更改其屬性的訂閱的名稱。
CONNECTION 'conninfo' #此子句替換由 CREATE SUBSCRIPTION 最初設定的連線字串。有關更多資訊,請參見此處。
SET PUBLICATION publication_nameADD PUBLICATION publication_nameDROP PUBLICATION publication_name #這些形式更改訂閱的釋出列表。 SET 用新列表替換整個釋出列表,ADD 將額外的釋出新增到釋出列表中,而 DROP 從釋出列表中刪除釋出。我們允許在 ADD 和 SET 變體中指定不存在的釋出,以便使用者稍後新增它們。有關更多資訊,請參見 CREATE SUBSCRIPTION。預設情況下,此命令還將執行 REFRESH PUBLICATION 的操作。
publication_option 指定此操作的附加選項。支援的選項為
refresh (boolean)當為 false 時,命令將不嘗試重新整理表資訊。此時應單獨執行 REFRESH PUBLICATION。預設值為 true。
此外,還可以指定 REFRESH PUBLICATION 下描述的選項,以控制隱式重新整理操作。
REFRESH PUBLICATION #從釋出者獲取丟失的表資訊。這將啟動自 CREATE SUBSCRIPTION 或上次呼叫 REFRESH PUBLICATION 以來新增到訂閱的釋出中的表的複製。
refresh_option 指定重新整理操作的附加選項。支援的選項為
ENABLE #啟用先前已停用的訂閱,並在事務結束時啟動邏輯複製工作程序。
DISABLE #停用正在執行的訂閱,並在事務結束時停止邏輯複製工作程序。
SET ( subscription_parameter [= value] [, ... ] ) #此子句修改由 CREATE SUBSCRIPTION 最初設定的引數。有關更多資訊,請參見此處。可以修改的引數是 slot_name、synchronous_commit、binary、streaming、disable_on_error、password_required、run_as_owner、origin、failover 和 two_phase。只有超級使用者才能設定 password_required = false。
更改 slot_name 時,命名槽的 failover 和 two_phase 屬性值可能與訂閱中指定的 failover 和 two_phase 引數不匹配。建立槽時,請確保槽屬性 failover 和 two_phase 與訂閱的對應引數匹配。否則,釋出者上的槽的行為可能與這些訂閱選項的說法不同:例如,即使訂閱的 failover 選項已停用,釋出者上的槽也可能同步到備用節點,或者即使訂閱的 failover 選項已啟用,槽也可能被停用同步。
僅當訂閱被停用時,才能更改 failover 和 two_phase 引數。
當將 two_phase 從 true 更改為 false 時,如果找到由邏輯複製工作程序(在 two_phase 引數仍為 true 時)準備的任何事務,後端程序會報告錯誤。您可以在釋出者節點上解決已準備的事務,或者在訂閱者上手動回滾它們,然後重試。邏輯複製工作程序準備的與特定訂閱對應的事務具有以下模式:“pg_gid_%u_%u”(引數:訂閱 oid,遠端事務 ID xid)。要手動解決此類事務,您需要回滾所有名稱中包含相應訂閱 ID 的已準備事務。應用程式可以檢查 pg_prepared_xacts 以查詢所需的已準備事務。在 two_phase 選項從 true 更改為 false 後,釋出者將在事務提交時重新複製它們。
SKIP ( skip_option = value ) #跳過應用遠端事務的所有更改。如果傳入資料違反任何約束,邏輯複製將停止,直到問題解決。透過使用 ALTER SUBSCRIPTION ... SKIP 命令,邏輯複製工作程序將跳過事務中的所有資料修改更改。此選項對透過在訂閱者上啟用 two_phase 準備的事務無效。在邏輯複製工作程序成功跳過事務或完成事務後,LSN(儲存在 pg_subscription.subskiplsn 中)將被清除。有關邏輯複製衝突的詳細資訊,請參閱 Section 29.7。
skip_option 指定此操作的選項。支援的選項為
lsn (pg_lsn)指定邏輯複製工作程序要跳過更改的遠端事務的完成 LSN。完成 LSN 是事務已提交或已準備的 LSN。不支援跳過單個子事務。將 NONE 設定將重置 LSN。
new_owner #訂閱新所有者的使用者名稱。
new_name #訂閱的新名稱。
指定布林型別引數時,可以省略 = value 部分,這等同於指定 TRUE。
將訂閱訂閱的釋出更改為 insert_only
ALTER SUBSCRIPTION mysub SET PUBLICATION insert_only;
停用(停止)訂閱
ALTER SUBSCRIPTION mysub DISABLE;
ALTER SUBSCRIPTION 是 PostgreSQL 的一個擴充套件。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。