CREATE SUBSCRIPTION

创建订阅-定义一个新的订阅

Synopsis

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

Description

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

订阅代表与发布者的复制连接。这样,此命令不仅会在本地目录中添加定义,而且还会在发布者上创建一个复制插槽。

逻辑复制工作程序将在运行此命令的事务提交时开始为新订阅复制数据。

有关订阅和整个逻辑复制的其他信息,请访问Section 31.2Chapter 31

Parameters

  • subscription_name

    • 新订阅的名称。
  • CONNECTION 'conninfo'

    • 与发布者的连接字符串。有关详细信息,请参见Section 33.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 )

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

进行同步逻辑复制时,可能需要使用其他设置。逻辑复制工作程序将写入和刷新的位置报告给发布者,并且在使用同步复制时,发布者将 await 实际的刷新。这意味着在将订阅用于同步复制时,将订阅者的synchronous_commit设置为off可能会增加发布者上COMMIT的延迟。在这种情况下,将synchronous_commit设置为local或更高是有利的。

  • connect ( boolean )

    • 指定CREATE SUBSCRIPTION是否应该完全连接到发布者。将此设置为false会将enabledcreate_slotcopy_data的默认值更改为false

不允许将connect设置为falseenabledcreate_slotcopy_data设置为true组合。

由于当此选项设置为false时没有构建连接,因此不预订表,因此在启用预订之后,将不会复制任何内容。需要运行ALTER SUBSCRIPTION ... REFRESH PUBLICATION才能预订表。

Notes

有关如何配置订阅和发布实例之间的访问控制的详细信息,请参见Section 31.7

创建复制插槽(默认行为)时,不能在事务块内部执行CREATE SUBSCRIPTION

仅当未将复制插槽作为同一命令的一部分创建时,创建连接到同一数据库集群的预订(例如,在同一集群中的数据库之间进行复制或在同一数据库中进行复制)才会成功。否则,CREATE SUBSCRIPTION通话将挂断。要使此工作有效,请单独创建复制插槽(使用带有插件名称pgoutput的功能pg_create_logical_replication_slot)并使用参数create_slot = false创建预订。这是一个实施限制,在将来的版本中可能会取消。

Examples

创建对远程服务器的预订,该预订将复制发布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);

Compatibility

CREATE SUBSCRIPTION是 PostgreSQL 扩展。

See Also

ALTER SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION