1

我们希望使用 Postgres 逻辑复制将更改从上游服务器(“源”服务器)移动到下游服务器(“接收器”服务器)。

当我们模拟灾难恢复场景时,我们会遇到问题。为了模拟这一点,我们在复制仍处于活动状态时删除了源数据库。然后我们启动一个新的源数据库并尝试:a)将数据从接收器移动到源,b)设置复制。在这个阶段,我们会遇到两个错误之一,具体取决于我们设置复制的时间(移动数据之前或之后)。

我们在测试上述内容后得到的错误是以下之一:

复制槽已被使用,难以重新启用槽而不删除

LOG:  logical replication apply worker for subscription "test_sub" has started
ERROR:  could not start WAL streaming: ERROR:  replication slot "test_sub" does not exist
LOG:  worker process: logical replication worker for subscription 16467 (PID 205) exited with exit code 1

Tried amending using:
ALTER SUBSCRIPTION "test_sub" disable;
ALTER SUBSCRIPTION "test_sub" SET (slot_name = NONE);
DROP SUBSCRIPTION "test_sub";

由于 PK 冲突,无法创建订阅

ERROR:  duplicate key value violates unique constraint "test_pkey"
DETAIL:  Key (id)=(701) already exists.
CONTEXT:  COPY test, line 1

一些可能的解决方案:

  • 在给定的 WAL 记录号之后设置逻辑复制。这样可以避免我们面临的PK问题
  • 找到在源数据库上重新创建复制槽的方法
  • 备份 Postgres 服务器,包括复制槽,然后重新导入

这是否适合 Postgres 逻辑复制的用例?这是一个典型的灾难恢复场景,所以想知道如何最好地实施。谢谢!

4

0 回答 0