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、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_nameADD PUBLICATION publication_nameDROP 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 为刷新操作指定额外的选项。支持的选项有:
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 的扩展。