PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER SUBSCRIPTION

ALTER SUBSCRIPTION — 更改一个订阅的定义

Synopsis

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、ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ...(其 refresh 选项为 true)、ALTER SUBSCRIPTION ... SET (failover = true|false) 以及 ALTER SUBSCRIPTION ... SET (two_phase = false) 不能在事务块内执行。

命令 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 和 ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ...(其 refresh 选项为 true)在订阅启用了 two_phase 提交时也不能执行,除非 copy_data 为 false。要了解实际的两阶段状态,请参见 subtwophasestate 列(位于 pg_subscription 中)。

参数

name #

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

CONNECTION 'conninfo' #

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

SET PUBLICATION publication_name
ADD PUBLICATION publication_name
DROP PUBLICATION publication_name #

这些形式更改被订阅的发布列表。SET 用一个新列表替换整个发布列表,ADD 向发布列表中添加更多发布,DROP 从发布列表中移除发布。我们允许在 ADD 和 SET 变体中指定不存在的发布,以便用户以后可以添加它们。更多信息参见 CREATE SUBSCRIPTION。默认情况下,该命令还会像 REFRESH PUBLICATION 一样起作用。

publication_option 为这个操作指定额外的选项。支持的选项有:

refresh (boolean)

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

Additionally, the options described under REFRESH PUBLICATION may be specified, to control the implicit refresh operation.

REFRESH PUBLICATION #

从发布者获取缺失的表信息。这将开始对自 CREATE SUBSCRIPTION 或上一次调用 REFRESH PUBLICATION 以来添加到被订阅发布中的表进行复制。

refresh_option 为刷新操作指定额外的选项。支持的选项有:

copy_data (boolean)

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

之前已订阅的表不会被复制,即使某个表的行过滤器 WHERE 子句在此期间被修改过。

请参见 Notes 以了解 copy_data = true 如何与 origin 参数交互的详细信息。

请参见 binary 这一 CREATE SUBSCRIPTION 参数,以了解以二进制格式复制已有数据的详细信息。

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、远程事务标识 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 #

该订阅的新名称。

当指定 boolean 类型的参数时,= value 部分可以省略,这等价于指定 TRUE。

示例

将一个订阅所订阅的发布更改为 insert_only:

ALTER SUBSCRIPTION mysub SET PUBLICATION insert_only;

禁用(停止)该订阅:

ALTER SUBSCRIPTION mysub DISABLE;

兼容性

ALTER SUBSCRIPTION 是 PostgreSQL 的扩展。

另请参阅

CREATE SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION