CREATE SUBSCRIPTION
CREATE SUBSCRIPTION — 定义一个新的订阅
大纲
CREATE SUBSCRIPTIONsubscription_nameCONNECTION 'conninfo' PUBLICATIONpublication_name[, ...] [ WITH (subscription_parameter[=value] [, ... ] ) ]
描述
CREATE SUBSCRIPTION 为当前数据库添加一个新订阅。订阅名称必须与数据库中任何现有订阅的名称不同。
订阅表示与发布者的复制连接。因此,该命令不仅会在本地系统目录中添加定义,还会在发布者上创建一个复制槽。
在执行该命令所在事务提交时,会启动一个逻辑复制工作进程,为新订阅复制数据。
参数
subscription_name新订阅的名称。
CONNECTION 'conninfo'连接到发布者的连接字符串。详情请参见第 34.1.1 节。
PUBLICATIONpublication_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 设置。默认值为
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 创建订阅。这是一个实现限制,未来版本中可能会解除。
示例
创建一个指向远端服务器的订阅,复制发布
mypublication 和 insert_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 扩展。