问题标签 [logical-replication]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
463 浏览

postgresql - PostgreSQL 13.3 逻辑复制不会在主服务器中创建复制槽

我是 PostgreSQL 的新手。我正在尝试创建位于同一 localhost 和端口中的 2 个数据库的逻辑复制(我不知道这是否是我遇到的问题的一部分)。关键是,我创建发布没有问题,但是,在我创建订阅的那一刻,必须在主服务器中创建的复制槽不会创建。我有wal_level = logical,但我不知道是否需要在postgres.conf or中进行其他配置pg_hba

另一个细节是我无法通过代码创建订阅,Postgres 只是没有响应,就像卡在那里一样,没有显示任何错误消息或确认。我可以创建订阅的唯一方法是在 pgAdmin 4 中,但这里出现了它没有创建复制槽的错误。

任何帮助建议都被接受。顺便说一句,对不起,如果我的英语有点糟糕,我希望我已经解释过了。

0 投票
0 回答
43 浏览

postgresql - 如何在逻辑复制期间访问触发器函数内的表

设想:

我们有两个表,第一个调用 main_table。第二个调用查找表。我们需要通过 Postgres 内置逻辑复制从其他数据库实例复制 main_table。

同时,我们必须根据查找表过滤一些行。

我们为它创建一个触发器。

当我们从 psql shell 本地插入时。触发器被触发并按预期工作。但是,一旦我们打开逻辑复制。我们得到错误。

想了解为什么?

0 投票
0 回答
160 浏览

postgresql - 带有 RDS postgres 和主副本故障转移的 Debezium

我有一个 RDS 多可用区 postgres 数据库(主备用),我正在调查 Debezium 以将更改流式传输到 Kafka。

我正在阅读故障转移情况下可能出现问题的文档:https ://debezium.io/documentation/reference/1.1/connectors/postgresql.html#_cluster_failures ,它看起来像一个非常可怕的场景。

从我通过故障转移重新启动进行的一些测试中,似乎当端点从主节点更改为备用节点时,Debezium 连接器继续工作并自动在备用节点上创建一个复制槽。但是据我了解,除非您可以确保在写入新数据之前创建新主(旧备用)上的复制槽,否则无法保证不会丢失数据。

有没有人有这种设置的经验?如果发生故障转移,您如何管理事情?

0 投票
1 回答
50 浏览

postgresql - PostgreSQL 是否支持仅复制发布列的子集?

我一直在阅读 PostgreSQL 中的逻辑复制,这似乎是在多个数据库之间共享少量表的一个非常好的解决方案。我的情况更简单,因为我的订阅者只会以只读方式使用源表。

我知道我可以在订阅节点的订阅表中添加额外的列,但是如果我只想导入源表的整个列集的一个子集怎么办?有可能还是会抛出错误?

例如,我的源表product有很多列,其中许多与我的订阅者数据库无关。product在每个订阅者处创建仅包含真正需要的列的副本是否可行?

0 投票
0 回答
35 浏览

postgresql - Postgres 逻辑复制 - 何时生成类型消息?

我有一个应用程序处理来自 PostgreSQL 服务器的逻辑复制输出。我们使用 pgoutput 插件从复制槽创建发布和读取数据。

Postgres 具有各种用于逻辑复制的消息格式,如下所述:https ://www.postgresql.org/docs/10/protocol-logicalrep-message-formats.html

目前,我处理关系消息以获取处理插入、更新和删除所需的大部分信息。但是,对于类型信息,我目前使用 SQL 查询来获取列类型信息。我想使用 Type 消息,但我从来没有看到它们。我看到 Begin、Commit 等,但从来没有 Type。

  • 服务器何时生成和发送 Type 消息?
  • 有没有办法让它们生成?
  • 这些类型 id > 类型映射是一成不变的,还是 PostgreSQL 允许服务器具有自定义类型(我注意到命名空间是与类型一起发送的属性之一)?

非常感谢任何帮助-谢谢。

0 投票
0 回答
23 浏览

postgresql - Postgresql 逻辑复制不适用于某些表

我已经在 PostgreSQL 11 中的两台服务器之间设置了逻辑复制。对于某些表复制不起作用。我从发布中删除了这些表并将它们添加回来并刷新了订阅。仍然没有发生复制。我检查了订阅者日志,日志中也没有错误。这可能是什么原因。如何解决此问题。

0 投票
0 回答
50 浏览

postgresql - 我能否将 AWS RDS 配置为仅将 INSERT 操作流式传输到 AWS DMS?

我的要求是仅将我数据库中特定表上的 INSERT 流式传输到 Kinesis 数据流。

我已经在我的 AWS 环境中配置了这个管道:

此设置工作正常,但它处理我的源表上的所有更改,甚至更新和删除。

我试过的:

  • 在 Postgres 逻辑解码插件中寻找配置选项。DMS 使用test_decodingPG 插件,该插件不接受按操作类型包含/排除数据更改的选项。
  • 查看 DMS 选择和过滤规则。仍然没有看到任何可能有帮助的东西。

当然,我可以在我的 Kinesis 消费者中简单地忽略源自非 INSERT 操作的记录,但这看起来不像是一种具有成本效益的实现方式。

有什么方法可以使用这些 AWS 服务(RDS -> DMS -> Kinesis)来满足我的要求?

0 投票
1 回答
185 浏览

postgresql - 从给定 LSN 开始的 postgres 逻辑复制

Postgres 逻辑复制初始同步过程非常缓慢,尤其是在原始数据库很大的情况下。

我想知道是否可以从给定的 LSN 开始复制?

所需的工作流程将是

  1. 从源数据库获取当前 LSN
  2. 在源数据库中创建所需对象的逻辑转储
  3. 在目标数据库上恢复转储
  4. 从步骤 1 中获取的 LSN 开始逻辑复制

我没有找到任何允许第 4 步的文档,有人知道是否可能吗?

0 投票
2 回答
93 浏览

postgresql - postgres 14“创建出版物”停留了几个小时

我使用 pg_upgrade--link选项从 Postgres 10 升级到 Postgres 14。数据库总大小约为 10TB。pg_upgrade 成功且快速,就像建议的工具一样 -

Optimizer statistics are not transferred by pg_upgrade. Once you start the new server, consider running: /usr/pgsql-14/bin/vacuumdb --all --analyze-in-stages

我运行了上述命令,但进程卡住了。作为这种(或不确定,不确定)的副作用,当我创建出版物时,提示永远不会回来,并且即使经过数小时也不会创建出版物。

postgres=# select * from pg_stat_progress_vacuum;

c1 c2
PID 9520
数据 16402
数据名 xyz
22423
阶段 吸尘指数
heap_blks_total 232816470
heap_blks_scanned 36766348
heap_blks_vacuumed 0
index_vacuum_count 0
max_dead_tuples 11184809
num_dead_tuples 11184521

这与昨天的输出相同。我能做些什么来加快这个和“创建出版物”命令?附带说明:运行 Postgres 的 VM 非常强大(64GB RAM,16 核)。谢谢!


编辑 1:相同 pid 的 pg_stat_activity 的输出,

c1 c2
PID 9520
backend_start 2021-12-06 15:13:23.479071-08
xact_start 2021-12-06 15:13:23.512581-08
查询开始 2021-12-06 15:13:23.512581-08
state_change 2021-12-06 15:13:23.512581-08
等待事件类型 超时
等待事件 真空延迟
状态 积极的
backend_xmin 3140627534
询问 autovacuum: VACUUM xyz (防止环绕)
后端类型 自动吸尘器
0 投票
1 回答
64 浏览

postgresql - postgresql 订阅不适用于公共以外的模式

我正在尝试使用两个本地 postgresql 服务器(node1:端口 5434,node2:端口 5435)创建逻辑复制。

我可以成功地在 node1 和 node2 上为公共模式中的表创建发布和订阅。

节点1:

节点2:

Node2 public.t1 复制 node1 public.t1 中的所有数据。

但是,我的问题是当我使用相同的代码但在不同的模式中创建发布和订阅时,node2 无法复制。

下面是一些 pg_catalog 查询的输出:

节点1:

节点2:

如图所示select * from pg_catalog.pg_subscription_rel,两个订阅 test 和 cdl schema 处于d(data is being copied)状态。

关于如何解决此问题或诊断问题发生原因的任何建议?

正如 jjanes 所建议的,日志文件的片段如下所示:

即使在我授予SELECT ON cdl.t1 TO repuser;.