我们希望使用 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 逻辑复制的用例?这是一个典型的灾难恢复场景,所以想知道如何最好地实施。谢谢!