CREATE SUBSCRIPTION 是用于定义逻辑复制订阅的 DDL 命令。
CREATE SUBSCRIPTION 在 PostgreSQL 10 中添加。
用法
提供者上不需要存在相应的 publication。请注意,默认情况下会创建一个活动的复制槽。
变更历史
- PostgreSQL 19
- 添加了参数
max_retention_duration(提交 a850be2f)
- 添加了参数
- PostgreSQL 18
- 参数
streaming现在默认为parallel(提交 1bf1140b)
- 参数
- PostgreSQL 17
- 添加了参数
failover(提交 776621a5)
- 添加了参数
- PostgreSQL 16
- PostgreSQL 15
- 添加了参数
two_phase(提交 a8fd13ca) - 添加了参数
disable_on_error(提交 705e20f8) - 如果目标 publication 不存在,现在会发出
WARNING(提交 8f2e2bbf)
- 添加了参数
- PostgreSQL 14
- PostgreSQL 10
- 添加于 (提交 665d1fad)
示例
CREATE SUBSCRIPTION 的基本执行示例
postgres=# CREATE SUBSCRIPTION test_subscription CONNECTION 'host=node1 dbname=testdb user=produser' PUBLICATION test_publication; NOTICE: created replication slot "test_subscription" on publisher CREATE SUBSCRIPTION
在 psql 中列出可用的订阅
postgres=# \dRs
List of subscriptions
Name | Owner | Enabled | Publication
-------------------+----------+---------+--------------------
test_subscription | postgres | t | {test_publication}
(1 row)
尝试创建重复订阅
postgres=# CREATE SUBSCRIPTION test_subscription
CONNECTION 'host=node1 dbname=testdb user=produser'
PUBLICATION test_publication;
ERROR: subscription "test_subscription" already exists
尝试使用不正确的 conninfo 字符串创建订阅
postgres=# CREATE SUBSCRIPTION dummy_subscription
CONNECTION 'host=foo.bar dbname=testdb user=produser'
PUBLICATION dummy_publication;
ERROR: could not connect to the publisher: could not translate host name "foo.bar" to address: Name or service not known
尝试使用无效的 conninfo 字符串创建订阅
postgres=# CREATE SUBSCRIPTION dummy_subscription
CONNECTION 'hostname=foo.bar dbname=testdb user=produser'
PUBLICATION dummy_publication;
ERROR: invalid connection string syntax: invalid connection option "hostname"
参考资料
- PostgreSQL文档: CREATE SUBSCRIPTION
