Postgres逻辑复制灾难恢复

时间:2019-02-18 06:00:50

标签: postgresql logical-replication

我们希望使用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逻辑复制用例的很好分类吗?这是典型的灾难恢复方案,因此想知道如何最好地实施。谢谢!

0 个答案:

没有答案