Назад | Перейти на главную страницу

Потоковая репликация Postgresql с помощью restore_command для архивных файлов WAL

У меня есть основной сервер, который архивирует (и gzip) файлы WAL в /wal/archive/. На данный момент я пытаюсь настроить горячий резерв с потоковой репликацией из базовой резервной копии.

При запуске режима ожидания я заметил такие ошибки, как:

could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000142400000014 has already been removed

Это имеет смысл, поскольку с момента создания base_backup прошел около дня, а файлы WAL уже были заархивированы. Я предоставил restore_command в резервном сервере recovery.conf чтобы скопировать файл с первичного и разархивировать его:

restore_command = '(set -o pipefail; scp primary_ip:/wal/archive/%f.gz /dev/stdout | pigz -d > "%p")'

Как ни странно, повторялись одни и те же ошибки. Имейте в виду, что я проверил, что указанная выше команда работает, когда я запускаю ее и предоставляю файл. Я хотел посмотреть, действительно ли выполняется команда, поэтому добавил эхо:

restore_command = '(set -o pipefail; echo "%f" >> /data/test.txt && scp primary_ip:/wal/archive/%f.gz /dev/stdout | pigz -d > "%p")'

Я ясно вижу, что он не выполняет команду, поскольку /data/test.txt не создается. В postgres у пользователя есть разрешение на запись в /data/. Есть ли что-то, что нужно указать на резервном сервере, чтобы проинструктировать его использовать restore_command когда первичный уже заархивировал файл WAL?

Мой файл recovery.conf был настроен в соответствии с разделом 25.2.4 документы.