CREATE SUBSCRIPTION — define a new subscription
CREATE SUBSCRIPTIONsubscription_nameCONNECTION '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扩展。