CREATE SUBSCRIPTION — define a new subscription
CREATE SUBSCRIPTIONsubscription_name
CONNECTION 'conninfo
' PUBLICATIONpublication_name
[, ...] [ WITH (subscription_parameter
[=value
] [, ... ] ) ]
CREATE SUBSCRIPTION
为当前数据库增加一个新的订阅。订阅的名称必须与该数据库中任何现有的订阅不同。
订阅表示一个到发布者的复制连接。这样这个命令不仅在本地目录中增加一些定义,还会在发布者上创建一个复制槽。
在运行这个命令的事务被提交时,一个逻辑复制工作者将被启动来为新的订阅复制数据。
有关订阅和逻辑复制的额外信息也可以在Section 31.2和Chapter 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
时,将不会有复制槽与该订阅关联。如果复制槽将会在稍后被手工创建,就可以使用这个选项。这样的订阅必须把enabled
和create_slot
都设置为false
。
synchronous_commit
(enum
)
这个参数的值会覆盖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
以便表被订阅。
有关如何在订阅和publication实例之间配置访问控制的细节请参考Section 31.7。
在创建一个复制槽(默认行为)时,CREATE SUBSCRIPTION
不能在一个事务块中执行。
创建一个连接到同一个数据库集簇的订阅(例如,在同一个集簇中的数据库间复制或者在同一个数据库中复制)仅当同一个命令中没有创建复制槽时才能成功。否则,CREATE SUBSCRIPTION
调用将会挂住。为了让这种方式可行,应该单独创建复制槽(使用函数pg_create_logical_replication_slot
,插件名是pgoutput
)并且使用参数create_slot = false
创建定于。这是一种实现导致的限制,可能会在未来的版本中得到提升。
创建一个到远程服务器的订阅,它复制mypublication
和insert_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扩展。