当前位置: 首页 > 知识库问答 >
问题:

在PostgreSQL 10中手动创建用于发布的复制槽

韩彬
2023-03-14
pg_create_logical_replication_slot('my_slot', 'wal2json');

并使用pg_recvlogic或进行特殊的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,插件名为phtml" target="_blank">goutput)

根据文档,这是可能的,但是pg_create_logical_replication_slot只创建一个常规的复制槽。是pgoutput插件造成了所有的魔力吗?如果是,那么就不可能在出版物中使用其他插件,如Wal2json

我在这里漏掉了什么?

共有1个答案

凌嘉勋
2023-03-14

我对Postgres中的逻辑复制和逻辑解码的经验有限,所以如果下面的错误请纠正我。话虽如此,以下是我的发现:

  1. 发布支持由pgoutput插件提供。您可以通过特定于插件的选项来使用它。可能是其他插件有可能添加支持,但我不知道逻辑解码插件界面是否暴露了足够的细节。我在wal2json插件版本9e962ba上测试了它,它不能识别这个选项。
  2. 复制插槽是独立于发布创建的。在获取更改流时指定要用作筛选器的发布。可以先查看一个发布的更改,然后查看另一个发布的更改,并观察不同的更改集,尽管使用了相同的复制槽(我没有找到它的文档,并且我正在Aurora上测试Postgres兼容性,因此行为可能会有所不同)。
  3. 插件输出似乎包括begin和commit的所有条目,即使事务处理没有触及相关发布中包含的任何表。但是,它不包括对发布中包含的其他表的更改。

下面是如何在Postgres 10+中使用它的示例:

-- Create publication
CREATE PUBLICATION cdc;

-- Create slot
SELECT pg_create_logical_replication_slot('test_slot_v1', 'pgoutput');

-- Create example table
CREATE TABLE replication_test_v1
(
  id integer NOT NULL PRIMARY KEY,
  name text
);

-- Add table to publication
ALTER PUBLICATION cdc ADD TABLE replication_test_v1;

-- Insert example data
INSERT INTO replication_test_v1(id, name) VALUES
  (1, 'Number 1')
;

-- Peak changes (does not consume changes)
SELECT pg_logical_slot_peek_binary_changes('test_slot_v1', NULL, NULL, 'publication_names', 'cdc', 'proto_version', '1');

-- Get changes (consumes changes)
SELECT pg_logical_slot_get_binary_changes('test_slot_v1', NULL, NULL, 'publication_names', 'cdc', 'proto_version', '1');
 类似资料:
  • pre { white-space: pre-wrap; } 面板(Panel)允许您创建用于多种用途的自定义布局。在本实例中,我们使用面板(panel)和布局(layout)插件来创建一个 msn 消息框。 我们在区域面板中使用多个布局(layout)。在消息框的顶部我们放置一个查询输入框,同时在右边放置一个人物图片。在中间的区域我们通过设置 split 属性为 true,把这部分切割为两部分,

  • 我即将对我的项目进行一个重大的技术更改,从ANT转移到Gradle。这个项目从来没有发布过--它仍在开发中。我想标记最后的旧技术版本,以便可以找到参考或逆转。但我不想暗示有任何一种释放。 然后 我之前向GitHub提交了一个支持请求,但当时他们有一些支持积压,所以我的请求被关闭了。

  • 本文向大家介绍playframework 手动创建JSON,包括了playframework 手动创建JSON的使用技巧和注意事项,需要的朋友参考一下 示例 您可以JsValue手动构建JSON对象树(a ) 或使用较短的等效语法,基于一些隐式转换: 要获取JSON字符串:            

  • 我已经开始学习母语。我已经建立了一个演示应用程序。我想制作一个发布版本,并在我的物理设备上安装apk。谁能提供关于如何在react native中构建apk的文档?

  • 我很确定我以前做过这件事,所以我不知道为什么它现在会导致错误。这是我得到的错误: 它指向我定义新对象的位置,所以在静态上下文中不允许在方法调用中这样做吗?我需要定义一个变量并传入吗?因为那样会花更多的时间,而且会更加混乱。。。。 对于适当的上下文: 数组的类型为ArrayList Point是我定义的类。构造函数调用正确 p是Point的一个实例。它有两个字段:d0和d1(维度0和维度1,以减少与