Ошибка слота репликации Postgresql postgresql

Я использую Posgtresql 10.

Я хочу реплицировать 2 таблицы из базы данных «db» в те же две таблицы с одинаковыми столбцами в базе данных «назначения».

изменил значение wal_level на логическое в postgresql.conf и max_replication_slots на 10

нет брандмауэра

Я создал публикацию в базе данных "db"

ALTER ROLE my_user WITH REPLICATION LOGIN PASSWORD 'my_password';
CREATE PUBLICATION my_publication;
ALTER PUBLICATION my_publication ADD TABLE table1;
ALTER PUBLICATION my_publication ADD TABLE table2;

Я создал подписку в "назначении" базы данных со слотом, потому что я хочу реплицировать на том же сервере:

SELECT pg_create_logical_replication_slot('test_slot_v1', 'pgoutput');
CREATE SUBSCRIPTION my_subscription CONNECTION 'host=localhost port=5432 password=my_password user=my_user dbname=db' PUBLICATION my_publication WITH (slot_name=test_slot_v1, create_slot=false);
alter subscription my_subscription refresh publication ;

Первая репликация работает. Затем, когда я изменяю значение одной записи varchar (не FK), значение не реплицируется, и в журналах postgres появляется следующая ошибка:

2020-04-12 16: 16: 57.886 CEST [720474] LOG: начался процесс применения логической репликации для подписки my_subscription. 2020-04-12 16: 16: 57.888 CEST [720475] ОШИБКА: слот репликации test_slot_v1 "не был создан в этой базе данных 2020-04-12 16: 16: 57.889 CEST [720474] ОШИБКА: не удалось получить данные из потока WAL: ОШИБКА: слот репликации" test_slot_v1 "не был создан в этой базе данных < / strong> 2020-04-12 16: 16: 57.890 CEST [712133] LOG: рабочий процесс: рабочий процесс логической репликации для подписки 245251 (PID 720474), выход с кодом выхода 1

Я уверен, что создал слот в «назначении» базы данных, который содержит подписку.

Любые идеи ? Заранее спасибо.


person batmaniac    schedule 12.04.2020    source источник


Ответы (1)


Я отвечу на свой вопрос: Postgresql хочет, чтобы слот был создан в базе данных «db», в которой я создал свою публикацию, а не в «назначении» базы данных, где я создал подписку.

Что я сделал: psql \ c destination drop subscription my_subscription; \ q psql \ c db SELECT pg_create_logical_replication_slot ('test_slot_v1', 'pgoutput'); \ q psql \ c destination CREATE SUBSCRIPTION my_subscription CONNECTION 'host = localhost port = 5432 password = my_password user = my_user dbname = db' ПУБЛИКАЦИЯ my_publication WITH (slot_name = test_slot_v1, create_slot = false);

Похоже, что эта команда не нужна: изменить подписку my_subscription обновить публикацию;

person batmaniac    schedule 12.04.2020