我正在尝试从我的 PostgreSQL 数据库中获取某些表的更新流。获取所有更新的常规方式如下所示:
您创建一个逻辑复制槽
pg_create_logical_replication_slot('my_slot', 'wal2json');
并使用pg_recvlogical
或进行特殊的 SQL 查询连接到它。这允许您以 json 格式从数据库中获取所有操作(如果您使用了 wal2json插件或类似插件),然后对这些数据执行任何您想要的操作。
但是在 PostgreSQL 10 中,我们有发布/订阅机制,它允许我们只复制选定的表。这非常方便,因为没有发送很多无用的数据。该过程如下所示:
首先,您创建一个出版物
CREATE PUBLICATION foo FOR TABLE herp, derp;
然后您从另一个数据库订阅该出版物
CREATE SUBSCRIPTION mysub CONNECTION <connection stuff> PUBLICATION foo;
这会在后台在主数据库上创建一个复制槽,并开始监听更新并将它们提交到第二个数据库上的相同表中。如果您的工作是复制一些表,但想为我的东西获取原始流,这很好。
正如我所提到的,CREATE SUBSCRIPTION
查询是在后台的主数据库上创建一个复制槽,但是如何在没有订阅和第二个数据库的情况下手动创建一个?这里的文档说:
为了使这个工作,单独创建复制槽(使用函数 pg_create_logical_replication_slot 和插件名称 pgoutput)
根据文档,这是可能的,但pg_create_logical_replication_slot
只会创建一个常规的复制槽。pgoutput
插件负责所有的魔法吗?如果是,那么就无法使用其他插件wal2json
,例如出版物。
我在这里想念什么?