CREATE SUBSCRIPTION

CREATE SUBSCRIPTION — define a new subscription

Synopsis

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

简介

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

订阅表示一个到发布者的复制连接。这样这个命令不仅在本地目录中增加一些定义,还会在发布者上创建一个复制槽。

在运行这个命令的事务被提交时,一个逻辑复制工作者将被启动来为新的订阅复制数据。

有关订阅和逻辑复制的额外信息也可以在Section 31.2Chapter 31中找到。

参数

subscription_name

新订阅的名称。

CONNECTION 'conninfo'

到发布者的连接字符串。详情请见Section 34.1.1

PUBLICATION publication_name

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

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

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

copy_data (boolean)

指定被订阅的publication中已有的数据是否应该在复制开始时被拷贝。默认是true

create_slot (boolean)

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

enabled (boolean)

===Specifies whether the subscription should be actively replicating, or whether it should be just setup but not started yet. 默认是true

slot_name (string)

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

slot_name被设置为NONE时,将不会有复制槽与该订阅关联。如果复制槽将会在稍后被手工创建,就可以使用这个选项。这样的订阅必须把enabledcreate_slot都设置为false

synchronous_commit (enum)

这个参数的值会覆盖synchronous_commit设置。默认值是off

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

在做同步逻辑复制时,采用不同的设置可能会更合适。逻辑复制工作者会报告写入以及刷写位置给发布者,并且在使用同步复制时,发布者将等待实际的刷写。这意味着当订阅被用于同步复制时把订阅者的synchronous_commit设置为off可能增减发布者上COMMIT操作的延迟。在这种场景中,将synchronous_commit设置为local或者更高会有优势。

connect (boolean)

指定CREATE SUBSCRIPTION是否应该连接到发布者。设置这个选项为false将改变enabledcreate_slot以及copy_data的默认值为false

不允许这样的组合:connect设置为false并且enabledcreate_slot或者copy_data设置为true

由于当这个选项被设置为false时不会建立连接,表不会被订阅并且因此在你启用订阅后也不会有东西被复制。需要运行ALTER SUBSCRIPTION ... REFRESH PUBLICATION以便表被订阅。

注解

有关如何在订阅和publication实例之间配置访问控制的细节请参考Section 31.7

在创建一个复制槽(默认行为)时,CREATE SUBSCRIPTION不能在一个事务块中执行。

创建一个连接到同一个数据库集簇的订阅(例如,在同一个集簇中的数据库间复制或者在同一个数据库中复制)仅当同一个命令中没有创建复制槽时才能成功。否则,CREATE SUBSCRIPTION调用将会挂住。为了让这种方式可行,应该单独创建复制槽(使用函数pg_create_logical_replication_slot,插件名是pgoutput)并且使用参数create_slot = false创建定于。这是一种实现导致的限制,可能会在未来的版本中得到提升。

示例

创建一个到远程服务器的订阅,它复制mypublicationinsert_only两个publication中的表并且在提交时立即开始复制:

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