Мы собираемся использовать Postgres Logical Replication для перемещения изменений с вышестоящего сервера («исходного» сервера) на нижестоящий сервер («приемный» сервер).
Мы сталкиваемся с проблемами при моделировании сценария аварийного восстановления.Чтобы смоделировать это, мы удаляем исходную базу данных, пока репликация еще активна.Затем мы вызываем новую исходную базу данных и пытаемся: а) переместить данные из приемника в источник и б) настроить репликацию.На этом этапе мы получаем одну из двух ошибок, в зависимости от того, когда мы настроили репликацию (до или после перемещения данных).
Ошибки, которые мы получаем после тестирования выше, являются следующими:
Слот репликации уже используется, сложность в повторном включении слота без удаления
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 Logical Replication?Это типичный сценарий аварийного восстановления, поэтому хотелось бы знать, как его лучше реализовать.Спасибо!