跳至主要內容

KlustronDB大约 4 分钟

CREATE SUBSCRIPTION

CREATE SUBSCRIPTION — 定义一个新的订阅

大纲

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

描述

CREATE SUBSCRIPTION为当前数据库添加一个新的订阅。 订阅名称必须与数据库中任何现有的订阅不同。

订阅表示到发布者的复制连接。因此,此命令不仅在本地目录中添加定义, 还会在发布者上创建复制插槽。

在运行此命令的事务提交时,将启动逻辑复制工作器以复制新订阅的数据。

关于订阅和逻辑复制的更多信息,请参见 第 31.2 节第 31 章

参数

subscription_name : 新订阅的名称。

CONNECTION 'conninfo' : 连接发布者的字符串。详细信息请见第 34.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`时,
    将不会有复制槽与订阅关联。这在需要稍后手动设置复制槽的情况下会使用。
    这样的订阅必须同时`enabled`并且
    `create_slot`设置为`false`。

`synchronous_commit` (`enum`)
:   该参数的值会覆盖[synchronous_commit](runtime-config-wal.md#GUC-SYNCHRONOUS-COMMIT)设置。
    默认值是`off`。

    对于逻辑复制使用`off`是安全的:
    如果订阅者由于缺少同步而丢失事务,数据将从发布者重新发送。

    进行同步逻辑复制时,不同的设置可能是合适的。
    逻辑复制工作者向发布者报告写入和刷新的位置,当使用同步复制时,
    发布者将等待实际刷新。这意味着,当订阅用于同步复制时,
    将订阅者的`synchronous_commit`设置为`off`
    可能会增加发布服务器上`COMMIT`的延迟。
    在这种情况下,将`synchronous_commit`设置为
    `local`或更高是有利的。

`connect` (`boolean`)
:   指定`CREATE SUBSCRIPTION`是否应该连接到发布者。
    将其设置为`false`将会改变默认值`enabled`、
    `create_slot`和`copy_data`为`false`。

    不允许将`connect`设置为`false`的同时将
    `enabled`、`create_slot`或`copy_data`
    设置为`true`。

    因为该选项设置为`false`时不会建立连接,
    因此表没有被订阅,所以当启用订阅后,不会复制任何内容。
    需要运行`ALTER SUBSCRIPTION ... REFRESH PUBLICATION`才能订阅表。

注意

有关如何在订阅和发布实例之间配置访问控制的详细信息,请参见 第 31.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 SUBSCRIPTION是一个PostgreSQL 扩展。

又见

ALTER SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION