У меня проблема с логической репликацией PostgreSQL версии 15. (Я также тестировал v10 и v12, но у меня была такая же проблема). Для тестирования требуется репликация, поэтому исходная и целевая базы данных находятся на одном сервере.
В конфигурационных файлах я установил:
postgresql.conf:
wal_level = logical # if I have "replica", I can't subscribe
pg_hba.conf:
local replication all
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
В исходной базе данных я делаю:
CREATE PUBLICATION repl_name
FOR TABLE table1, table2, table3, ...;
В pgAdmin на данном этапе у меня есть:
CREATE PUBLICATION
Query returned successfully in 59 msec.
Однако в журналах у меня есть сообщение для каждой таблицы:
2023-05-17 17:02:07.537 CEST [25356] ERROR: role "backup_user" does not exist
2023-05-17 17:02:07.537 CEST [25356] STATEMENT: GRANT SELECT ON SEQUENCE public.table1 TO backup_user;
Это может быть связано с тем, что у меня на компе восстанавливается бэкап с клиента, где эта репликация работает.
Но я не знаю, беспокоит ли это вас, потому что после ввода:
select * from pg_catalog.pg_publication;
Я вижу свои публикации:
"20438" "stack_repl" "10" false true true true true false
Но я не вижу его здесь:
select * from pg_stat_replication;
Я думаю, это может быть связано с тем, что пока нет подписки.
Настоящая проблема возникает, когда я хочу оформить подписку.
Во-первых, он восстанавливает базу данных с такими таблицами, как table1, table2, table3 и т. д. Естественно, таблицы пусты.
ввожу команду:
CREATE SUBSCRIPTION sub_test
CONNECTION 'dbname=dbname host=localhost port=5432 user=postgres password=12345'
PUBLICATION repl_name;
И pgAdmin бесконечно крутится. Даже когда я оставил компьютер на выходные, он не мог закончить.
В логах отображается:
2023-05-17 17:22:24.178 CEST [25376] LOG: logical decoding found initial starting point at 0/A0D6F338
2023-05-17 17:22:24.178 CEST [25376] DETAIL: Waiting for transactions (approximately 1) older than 3712 to end.
2023-05-17 17:22:24.178 CEST [25376] STATEMENT: CREATE_REPLICATION_SLOT "sub_test" LOGICAL pgoutput (SNAPSHOT 'nothing')
Уверяю вас, что я уже давно борюсь с этой проблемой и мне нужна поддержка/подсказки, что я могу сделать, чтобы данные начали реплицироваться.

Вероятно, вы настраиваете логическую репликацию между двумя базами данных в одном кластере баз данных. Это заставляет CREATE SUBSCRIPTION зависать навсегда, как документация описывает:
Создание подписки, которая подключается к одному и тому же кластеру базы данных (например, для репликации между базами данных в одном кластере или для репликации в одной базе данных), будет успешным, только если слот репликации не создан как часть той же команды. В противном случае вызов
CREATE SUBSCRIPTIONзависнет. Чтобы это работало, создайте слот репликации отдельно (используя функциюpg_create_logical_replication_slotс именем плагинаpgoutput) и создайте подписку, используя параметрcreate_slot = false. Это ограничение реализации, которое может быть снято в будущем выпуске.
Итак, путь к успеху:
подключитесь к первичной базе данных и создайте слот:
SELECT pg_create_logical_replication_slot('sub_test', 'pgoutput');
затем подключитесь к резервной базе данных и запустите:
CREATE SUBSCRIPTION sub_test
CONNECTION 'dbname=dbname host=localhost port=5432 user=postgres password=12345'
PUBLICATION repl_name
WITH (create_slot = false);
Спасибо, эта заметка решила мою проблему!