手动创建复制槽以便在PostgreSQL 10

时间:2018-03-16 14:42:38

标签: postgresql replication postgresql-10

我正在尝试从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查询是在主数据库下创建一个复制槽,但是如何在没有订阅和第二个数据库的情况下手动创建一个复制槽? Here文档说:

  

要使其工作,请单独创建复制槽(使用带插件名称pgoutput的函数pg_create_logical_replication_slot)

根据文档,这是可能的,但pg_create_logical_replication_slot仅创建常规复制槽。 pgoutput插件是否对所有魔法负责?如果是,则无法使用其他插件,如wal2json和发布。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

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

  1. pgoutput插件提供了出版物支持。您可以通过plugin-specific options使用它。可能其他插件可以添加支持,但是我不知道逻辑解码插件接口是否公开了足够的细节。我已针对wal2json插件版本9e962ba进行了测试,但无法识别此选项。
  2. 复制插槽是独立于发布创建的。在获取更改流时,指定要用作筛选器的发布。尽管使用相同的复制插槽,但可以窥视一个出版物的更改,然后窥视另一出版物的更改,并观察不同的更改集(我没有找到记录的文档,并且我正在与Postgres兼容的Aurora上进行测试,因此行为可能会有所不同)。
  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');

要将更改从Postgres流传输到其他系统,可以考虑使用Debezium项目。它是用于更改数据捕获的开源分布式平台,其中包括PostgreSQL连接器。在0.10版中,他们添加了对pgoutput插件的支持。即使您的用例与项目提供的用例有很大不同,您也可以查看他们的代码以了解他们如何与复制API交互。

答案 1 :(得分:0)

创建逻辑复制插槽和发布后,可以通过以下方式创建预订:

CREATE SUBSCRIPTION mysub
       CONNECTION <conn stuff>
       PUBLICATION foo
       WITH (slot_name=my_slot, create_slot=false);

不确定是否能回答您的问题。