受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

CREATE SUBSCRIPTION

CREATE SUBSCRIPTION — 定义一个新的订阅

Synopsis

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

描述

CREATE SUBSCRIPTION添加一个新的逻辑复制订阅。 创建订阅的用户将成为该订阅的所有者。订阅名称必须与当前数据库中 任何现有订阅的名称不同。

订阅表示与发布者的复制连接。因此,除了在本地系统目录中添加定义之外, 该命令通常还会在发布者上创建一个复制槽。

除非订阅初始即被禁用,否则在执行该命令所在事务提交时,会启动一个 逻辑复制工作进程为新订阅复制数据。

要能够创建订阅,必须具有pg_create_subscription角色的权限, 以及当前数据库上的CREATE权限。

关于订阅以及整个逻辑复制的更多信息,请参见 Section 29.2Chapter 29

参数

subscription_name #

新订阅的名称。

CONNECTION 'conninfo' #

定义如何连接到发布者数据库的libpq连接字符串。 详情请参见Section 32.1.1

PUBLICATION publication_name [, ...] #

要订阅的发布者上的发布名称。

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

该子句为订阅指定可选参数。支持下列参数:

copy_data (boolean) #

指定复制开始后,是否复制所订阅发布中已经存在的数据。 默认值为true

create_slot (boolean) #

指定该命令是否应在发布者上创建复制槽。默认值为 true

enabled (boolean) #

指定订阅是应当主动进行复制,还是仅完成设置但暂不启动。 默认值为true

slot_name (string) #

要使用的复制槽名称。默认行为是使用订阅名称作为槽名。

slot_name设为NONE时, 该订阅将不关联任何复制槽。当复制槽将在稍后手工创建时, 可以使用这种方式。这类订阅还必须同时将 enabledcreate_slot 设为false

synchronous_commit (enum) #

该参数的值会覆盖此订阅应用工作进程中的 synchronous_commit 设置。默认值为 off

对逻辑复制来说,使用off是安全的:如果订阅者因 缺少同步而丢失了事务,数据会再次从发布者发送过来。

在进行同步逻辑复制时,可能更适合使用不同的设置。逻辑复制工作进程会向 发布者报告写入和刷盘位置,而在使用同步复制时,发布者会等待真正的刷盘完成。 这意味着,当订阅被用于同步复制时,将订阅者的 synchronous_commit 设为 off 可能会增加发布者上 COMMIT 的延迟。在这种场景下, 将 synchronous_commit 设为 local 或更高可能更有利。

binary (boolean) #

指定订阅是否请求发布者以二进制格式(而不是文本格式)发送数据。 默认值为false。即使启用了此选项,也只有具有 二进制发送和接收函数的数据类型才会以二进制方式传输。

在进行跨版本复制时,可能会出现这样的情况:发布者对某种数据类型有 二进制发送函数,但订阅者缺少该类型的二进制接收函数。在这种情况下, 数据传输会失败,因此不能使用 binary 选项。

connect (boolean) #

指定 CREATE SUBSCRIPTION 是否完全连接到发布者。 将其设为 false 会把 enabledcreate_slotcopy_data 的默认值改为 false

不允许将 connect 设为 false, 同时又把 enabledcreate_slotcopy_data 设为 true

由于该选项设为 false 时不会建立连接,因此表不会被订阅, 所以即使之后启用了订阅,也不会复制任何内容。必须执行 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 才会订阅这些表。

streaming (boolean) #

指定是否为该订阅启用进行中事务的流式传输。默认情况下,所有事务 都会先在发布者上被完全解码,然后才整体发送给订阅者。

注意

关于如何在订阅与发布实例之间配置访问控制,详见 Section 29.7

当创建复制槽时(这是默认行为),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);

兼容性

CREATE SUBSCRIPTIONPostgreSQL扩展。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。