问题标签 [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 回答
116 浏览

postgresql - 是否可以在 postgreSQL 逻辑复制插件中获取当前的 64 位 transactionId(带有纪元)

我正在构建一个更改捕获系统,该系统通过逻辑解码输出插件使用 Postgres WAL。

在回调中,很容易访问当前的 transactionId ( https://doxygen.postgresql.org/structReorderBufferTXN.html#ad3ff4a8f320f2ec21e3e07688d29c741 ) 但这是 32 位的,可以在 4B 提交后环绕,因此它不可靠,因为一个逻辑计数器。

Postgres 内部维护一个不环绕的 64 位 transactionID(选择 txid_current()): https ://www.postgresql.org/docs/9.4/functions-info.html#FUNCTIONS-TXID-SNAPSHOT

https://github.com/postgres/postgres/blob/3412030205211079f9b0510e2244083e4ee7b15a/src/backend/access/transam/xact.c#L473-L488

是否可以从逻辑解码插件访问此 ID?如果不是,那是什么原因呢?

谢谢

0 投票
1 回答
156 浏览

postgresql - PostgreSQL 10 逻辑复制 - 是否可以克隆表?

我有两个带有 postgresql 10 的数据库实例。第一个使用 wal_level = logical 的实例,有 ALL TABLE 发布者。第二 - 订阅发布者,如上所述。

主数据库表中的所有数据都已成功发送到副本。对我来说只有一个问题——当我的应用程序在 Master 上添加一个新表时——我需要将同一个表添加到副本中(并运行 REFRESH PUBLICATION)。

我的问题 - 副本数据库有没有办法自动创建新表?

0 投票
0 回答
137 浏览

knex.js - Knex 使用 postgres 10 逻辑复制迁移到两个独立的数据库

我目前正在使用 knex 迁移来管理 postgres 架构更改。我有一个源数据库和一个目标数据库,使用 posgres 10.7 启用了逻辑复制。我试图找出保持模式相同的最佳方法,否则如果模式不完全匹配,复制将中断。为此,我想知道是否有办法同时运行 knex 迁移到两个单独的数据库,如果不是同一时间,则在源数据库上运行初始迁移后非常快。

0 投票
2 回答
549 浏览

postgresql - PostgreSQL 大表逻辑复制无限同步

我有一个大型且快速增长的 PostgreSQL 表(166GB 索引和 72GB 数据库)。我想设置这个表的逻辑复制。两边都是 11.4 版本。

我尝试这样做 2 周,但我唯一拥有的是无限同步和不断增长的副本上的表大小(已经 293 Gb 索引和 88 Gb 表,超过原始,并且日志中没有错误)。我也尝试进行转储,恢复它并开始同步 - 但现有主键出现错误。复制统计信息的 backend_xmin 值每周更改一次,但同步状态仍为“启动”。这些服务器之间的网络连接根本没有使用(它们在同一个数据中心),实际速度为 300-400Kb(看起来它主要是复制过程的流式传输部分)。

所以问题是如何正确设置大型且快速增长的表的逻辑复制,是否有可能以某种方式?谢谢你。

0 投票
0 回答
719 浏览

postgresql - How to disable subscription automatically on connexion lost (PostgreSQL Logical Replication)?

I am currently working on logical replication (master / slave) with PostgreSQL. It is working very well, but I would like to anticipate the scenario where the connexion is broken unexpectedly (master offline, or socket broken...).

I have found a way to mimic this scenario, and the following logs are produced :

Now, what I would like to do is find a way to disable the subscription automatically when it happens (ie. execute the following command), then the ERROR will not appear in the logs because the worker will not exist and will not try to connect to an offline master.

To do that, I see some options but I don't know how to apply them :

  1. Catch the ERROR (either in WAL or "logical replication worker")

  2. Find a way to execute some code at "logical replication worker" startup

  3. Use a CRON (at application level, so not native to PSQL) to check if the server is offline (pulsation). If so, then execute the above command manually. Note that this solution may work but I would like to avoid it because there will still be some errors raised if the connexion is lost between two "ticks" of the CRON

Thank you very much for your help, cheers

0 投票
1 回答
195 浏览

postgresql - PostgreSQL 订阅服务器在同步到发布服务器的更新时会锁定吗?

如果我有 3 个数据库

  • Db1:仅用于写入、发布者
    • Db2:仅用于读取,Db1 的订阅者
    • Db3:仅用于读取,Db1 的订阅者

只是为了澄清“仅用于读取”意味着我的应用程序不会尝试修改该数据库。反过来适用于“仅用于写入”。我不是在谈论数据库本身的功能。也许我会使用权限来实现这一点,但无论如何。

通过浏览逻辑复制的官方文档,我无法找到一些问题的答案:

  • 在对 Db1 进行新写入的情况下,Db2 和 Db3 会在同步更改时都锁定,还是允许在同步的同时进行读取?

  • 如果订阅服务器在发布对 Db1 的新更改时正在执行读取,那么可用的更改是否会在它们到达订阅者后立即执行的下一个操作,无论有多少读取已经在等待执行(如果有的话)?

我担心的是负载平衡集群(仅用于读取)PostgreSQL 服务器的一致性,这些服务器是 Db1 的副本。它们都应该与 Db1 同步,在与 Db1 发布的新更改同步之前不允许对它们进行任何新的读取。如果我不能通过逻辑复制来做到这一点,那么有什么替代方案(如果有的话)?

0 投票
1 回答
150 浏览

ruby-on-rails - Postgresql 10 逻辑复制 - 同步副本数据库表的最佳方法是什么

我设置了两个 VM,其中第一个 VM 是主 PostgreSQL,第二个是从属。我将 PostgreSQL 10 与逻辑复制一起使用,因此我创建了发布者和订阅。

最初,我在 Master 上创建了必要的表,然后进行备份并将其应用于从机,因此所有表都已同步并且一切正常。

我正在使用带有迁移的 Rails 应用程序,所以,现在我想将迁移应用到主数据库,这将创建很多新表。

创建具有复制索引的相同表的最佳方法是什么?

对我来说一个简单的解决方案 - 再次创建主数据库转储并将其应用于从站。

但是,也许存在其他解决方案来保持数据库结构同步?

0 投票
3 回答
2370 浏览

postgresql - 使用 Postgres 逻辑复制槽时如何限制 WAL 大小?

我正在通过 JDBC 驱动程序创建从 AWS Postgres RDS 到 java 进程的复制槽和流式更改。

我的复制槽创建代码如下所示。

我使用以下代码获得复制流。

当复制器 java 进程未运行时,WAL 大小会增加。这是我用来查找复制滞后的查询。

输出:

这种复制延迟会超过 RDS 磁盘,这会关闭 RDS。

我以为wal_keep_segments会解决这个问题,它设置为 32。但它没有用。是否有任何其他属性我必须设置以避免这种情况,即使 Java 复制进程没有运行。

0 投票
1 回答
4218 浏览

postgresql - 将新表添加到发布后,PostgreSQL 逻辑复制不起作用

我是 PostgreSQL 逻辑复制的新手。我做了测试,在将新表添加到发布后,我发现复制不起作用,直到我重新创建订阅,我确信重新创建订阅不是最佳做法,请您告知如何制作订阅者为新表申请事务?

测试如下:

  1. 在主端和复制端创建第一个表:

  2. 在主端创建发布:

  3. 在复制端创建订阅:

  4. 测试复制,复制工作。初级:

    复制:

  5. 在主端和复制端创建一个新表

  6. 将新表添加到主端的发布

  7. 测试复制,复制不工作。基本的:

复制:

注意: 中没有数据rep_test2,复制没有复制rep_test2

  1. 重新启动复制 postgres,复制仍然无法正常工作。

  2. 删除并重新创建订阅,复制工作。

基本的:

复制:

基本的:

复制:

重新创建订阅后复制工作。

您能否告知是否有另一种方法可以让订阅者将交易应用于新表?

顺便说一句,我的版本:

x86_64-pc-linux-gnu 上的 PostgreSQL 12.2,由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) 编译,64 位

谢谢

0 投票
0 回答
291 浏览

postgresql - 监控 postgres 逻辑复制

由于关键冲突,我们的逻辑复制最近停止了 - wals 正在下降但没有被应用。我想设置一些监控,以便在发生这种情况时收到通知,但我不确定要使用哪些字段。

我想我应该能够使用 pg_stat_subscription 视图,但我不确定从它的描述中它的列到底代表什么。

我可以将源的 pg_current_wal_lsn() 与副本的 pg_stat_subscription.received_lsn 进行比较以确保数据下降吗?

并且将副本的 pg_stat_subscription.received_lsn 与其 pg_stat_subscription.latest_end_lsn 进行比较让我知道数据是否正在重播?

这是我最不确定的最后一个问题——“报告给原始 WAL 发件人”是否意味着复制已在副本上成功重播?或者我需要使用其他一些字段来了解副本已成功应用源数据库中的更改的程度?