Логическая репликация PostgreSQL - создает зависания подписки
Я пытаюсь установить логическую репликацию между двумя облачными экземплярами как с Debian 9, так и с PG 11.1. Команда CREATE PUBLICATION
на мастере прошел успешно, но при запуске команды CREATE SUBSCRIPTION
на предполагаемой логической реплике команда висит бесконечно.
На главном компьютере я вижу, что слот репликации был создан и активен, и я вижу новый процесс walsender, созданный и "ожидающий", и в журнале на главном сервере я вижу эти строки:
2019-01-14 14:20:39.924 UTC [8349] repl_user@db LOG: logical decoding found initial starting point at 7B0/6C777D10
2019-01-14 14:20:39.924 UTC [8349] repl_user@db DETAIL: Waiting for transactions (approximately 2) older than 827339177 to end.
Но это все. Команда CREATE SUBSCRIPTION
никогда не заканчивается.
Master - это БД с тяжелыми вставками, например, 100 с в минуту, но они все всегда преданы. Так что не должно быть никаких длительных незафиксированных транзакций.
Я пытался гуглить по этой проблеме, но ничего не нашел. Что мне не хватает?
1 ответ
Поскольку базы данных "в облаке", вы не знаете, где они на самом деле.
Скорее всего, они находятся в одном кластере базы данных, что объясняет тупик, который вы видите: CREATE SUBSCRIPTION
ожидает завершения всех одновременных транзакций в кластере, который содержит базу данных источника репликации, прежде чем он сможет создать свой слот репликации, но, поскольку обе базы данных находятся в одном кластере, он ожидает завершения своей работы, что, очевидно, не произойдет.
Решение состоит в том, чтобы явно создать слот логической репликации в исходной базе данных и использовать этот существующий слот при создании подписки.