Логическая репликация PostgreSQL зависает на CREATE SUBSCRIPTION

У меня проблема с логической репликацией 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')

Уверяю вас, что я уже давно борюсь с этой проблемой и мне нужна поддержка/подсказки, что я могу сделать, чтобы данные начали реплицироваться.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, вы настраиваете логическую репликацию между двумя базами данных в одном кластере баз данных. Это заставляет 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);
    

Спасибо, эта заметка решила мою проблему!

Basaleel 19.05.2023 07:58

Другие вопросы по теме