2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

ALTER SUBSCRIPTION

ALTER SUBSCRIPTION — 更改订阅的定义

概要

ALTER SUBSCRIPTION name CONNECTION 'conninfo'
ALTER SUBSCRIPTION name SET PUBLICATION publication_name [, ...] [ WITH ( publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name ADD PUBLICATION publication_name [, ...] [ WITH ( publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name DROP PUBLICATION publication_name [, ...] [ WITH ( publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name ENABLE
ALTER SUBSCRIPTION name DISABLE
ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] )
ALTER SUBSCRIPTION name SKIP ( skip_option = value )
ALTER SUBSCRIPTION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER SUBSCRIPTION name RENAME TO new_name

描述

ALTER SUBSCRIPTION 可以更改 CREATE SUBSCRIPTION 中可以指定的订阅的大部分属性。

要使用 ALTER SUBSCRIPTION,您必须拥有该订阅。要重命名订阅或更改所有者,您必须对该数据库拥有 CREATE 权限。此外,要更改所有者,您必须能够 SET ROLE 为新的所有者角色。如果订阅的 password_required=false,则只有超级用户才能修改它。

刷新发布时,我们会删除不再属于该发布的关联,并且还会删除任何表同步槽。删除这些槽是必要的,以便释放远程主机上为订阅分配的资源。如果由于网络中断或其他错误,PostgreSQL 无法删除这些槽,则会报告错误。要在此情况下继续操作,用户需要重试操作,或将槽与订阅解除关联并删除订阅,具体方法请参见 DROP SUBSCRIPTION

命令 ALTER SUBSCRIPTION ... REFRESH PUBLICATION、带有 refresh 选项为 trueALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ...ALTER SUBSCRIPTION ... SET (failover = true|false)ALTER SUBSCRIPTION ... SET (two_phase = false) 不能在事务块内执行。

带有 refresh 选项为 true 的命令 ALTER SUBSCRIPTION ... REFRESH PUBLICATIONALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ... 也不可在订阅启用 two_phase 提交时执行,除非 copy_datafalse。请参见 pg_subscriptionsubtwophasestate 列以了解实际的两阶段提交状态。

参数

name #

要更改其属性的订阅的名称。

CONNECTION 'conninfo' #

此子句替换由 CREATE SUBSCRIPTION 最初设置的连接字符串。有关更多信息,请参见此处。

SET PUBLICATION publication_name
ADD PUBLICATION publication_name
DROP PUBLICATION publication_name #

这些形式更改订阅的发布列表。 SET 用新列表替换整个发布列表,ADD 将额外的发布添加到发布列表中,而 DROP 从发布列表中删除发布。我们允许在 ADDSET 变体中指定不存在的发布,以便用户稍后添加它们。有关更多信息,请参见 CREATE SUBSCRIPTION。默认情况下,此命令还将执行 REFRESH PUBLICATION 的操作。

publication_option 指定此操作的附加选项。支持的选项为

refresh (boolean)

当为 false 时,命令将不尝试刷新表信息。此时应单独执行 REFRESH PUBLICATION。默认值为 true

此外,还可以指定 REFRESH PUBLICATION 下描述的选项,以控制隐式刷新操作。

REFRESH PUBLICATION #

从发布者获取丢失的表信息。这将启动自 CREATE SUBSCRIPTION 或上次调用 REFRESH PUBLICATION 以来添加到订阅的发布中的表的复制。

refresh_option 指定刷新操作的附加选项。支持的选项为

copy_data (boolean)

指定在复制开始时是否复制被订阅发布中的现有数据。默认值为 true

先前已订阅的表不会被复制,即使表的行过滤器 WHERE 子句后来被修改。

有关 copy_data = true 如何与 origin 参数交互的详细信息,请参阅 Notes

有关以二进制格式复制现有数据的详细信息,请参阅 CREATE SUBSCRIPTIONbinary 参数。

ENABLE #

启用先前已禁用的订阅,并在事务结束时启动逻辑复制工作进程。

DISABLE #

禁用正在运行的订阅,并在事务结束时停止逻辑复制工作进程。

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

此子句修改由 CREATE SUBSCRIPTION 最初设置的参数。有关更多信息,请参见此处。可以修改的参数是 slot_namesynchronous_commitbinarystreamingdisable_on_errorpassword_requiredrun_as_owneroriginfailovertwo_phase。只有超级用户才能设置 password_required = false

更改 slot_name 时,命名槽的 failovertwo_phase 属性值可能与订阅中指定的 failovertwo_phase 参数不匹配。创建槽时,请确保槽属性 failovertwo_phase 与订阅的对应参数匹配。否则,发布者上的槽的行为可能与这些订阅选项的说法不同:例如,即使订阅的 failover 选项已禁用,发布者上的槽也可能同步到备用节点,或者即使订阅的 failover 选项已启用,槽也可能被禁用同步。

仅当订阅被禁用时,才能更改 failovertwo_phase 参数。

当将 two_phasetrue 更改为 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 SUBSCRIPTIONPostgreSQL 的一个扩展。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。