我们有一个具有多个数据库(A、B、C、D等)的postgres实例. 我们在数据库A ONLY上设置了debezium CDC.但我们还需要向其他数据库(如B)批量插入数百万行.似乎debezium CDC仍然需要扫描B的WAL并过滤掉事件,所以批量插入可能会减慢或阻止debezium,对吗?

如何避免这种堵塞或缓慢?当大容量插入时,我们应该暂时停止debezium连接吗?或者有什么方法可以跳过扫描数据库B的WAL吗?

谢谢

推荐答案

我们不能跳过扫描或读取数据库B的WAL.Walsender必须阅读所有事务,这样他才能知道数据库之间共享目录的变化,这是维护正确快照所必需的.在Postgres逻辑解码中,有三件主要事情:

1.读《华尔街日报》.

2.将更改排队到reorderBuffer.

3.对事务发起时来自reorderBuffer的更改进行解码.

数据库A的Walsender将只读取数据库B的更改,但不会将B的更改放入reorderBuffer.

以下是源代码中针对插入的判断/筛选 https://github.com/postgres/postgres/blob/65db0cfb4c036b14520a22dba5a858185b713643/src/backend/replication/logical/decode.c#L913

当逻辑解码正在进行时,如果您向Postgres并行插入数百万行,解码速率将会降低,因此您可以看到速度很慢.

Postgresql相关问答推荐

一列引用两个不同的表

如何在PostgreSQL中对深度嵌套的jsonb属性创建索引

即使不对订阅服务器进行任何修改,Postgres逻辑复制也可能发生冲突吗?

求和直到达到一个值 postgresql

如何创建一个触发器来传播对主键表的更新?

未更改表上的 Postgres 环绕预防

Power BI + Postgres:只读用户

如何使用有限的varchar在postgres中存储单词é

TimescaleDB 连续聚合:如何存储连续聚合结果

GORM 不会创建 many2many 关联

PostgreSQL unnest 与空数组

PostgreSQL错误致命:角色 username不存在

PostgreSQL:please specify covering index name是什么意思

Rails:安装 pg gem 时出错

Docker Compose + Spring Boot + Postgres 连接

将属性添加到 Sequelize FindOne 返回的对象

在 Postgresql 中拆分逗号分隔的字段并对所有结果表执行 UNION ALL

将数据推送到 Heroku 时出错:time zone displacement out of range

如何为 Postgres psql 设置时区?

在 postgresql 中获取上个月的数据