Я пытался настроить непрерывное архивирование для простой тестовой базы данных PostgreSQL 9.0, согласно документация. В postgres.conf я установил:
wal_level = архив
archive_mode = on
archive_command = 'touch / home / myusername / backup / testtouch'
archive_timeout = 30 с
... и перезапустил PostgreSQL. Файл, перечисленный на ощупь, никогда не появляется. Я могу вручную запустить сенсорную команду, и она работает должным образом.
Если я попытаюсь создать резервную копию, она будет вечно ждать команды archive_command. В psql;
postgres = # ВЫБРАТЬ pg_start_backup ('touchtest');
pg_start_backup
-----------------
0/14000020 (1 ряд)postgres = # ВЫБРАТЬ pg_stop_backup ();
ВНИМАНИЕ: очистка pg_stop_backup завершена, ожидается заархивирование необходимых сегментов WAL> ВНИМАНИЕ: pg_stop_backup все еще ожидает архивации всех необходимых сегментов WAL (прошло 60 секунд)
ПОДСКАЗКА: Убедитесь, что ваша команда archive_command выполняется правильно. pg_stop_backup можно безопасно отменить, но резервную копию базы данных нельзя будет использовать без всех сегментов WAL.
Что могло бы вызвать это? Как я могу решить эту проблему?
Дополнительная информация: работает на CentOS 5.4. PostgreSQL 9.0.2 установлен от имени пользователя root.
Обновление: я сначала попробовал архивировать как cp -i %p /home/myusername/backup/%f </dev/null
и test ! -f /home/myusername/backup/%f && cp %p /home/myusername/backup/%f
чтобы соответствовать руководству. Я свел его к более простому сенсорному вызову для устранения неполадок.
Эта конфигурация Postgres выглядит правильно
CentOS по умолчанию устанавливает режим пользовательского каталога на 700, поэтому проверьте, действительно ли это так и можно ли прикоснуться к этому файлу, используя su в качестве пользователя root.
su - postgres -c "touch /home/myusername/backup/testtouch"
Если это сработает, попробуйте использовать подробное ведение журнала в postgres и проверьте журнал postgres на наличие дополнительных ошибок.
Ваша команда архивирования должна содержать больше информации.
В archive_command% p заменяется именем пути к файлу для архивации, а% f заменяется только именем файла. (Имя пути указывается относительно текущего рабочего каталога, то есть каталога данных кластера.)
archive_command = 'copy "% p" "C: \ server \ archivedir \% f"' # Windows
Таким образом, мне (незнакомому с сенсорной командой CentOS) не кажется, что вы включаете переменные в свой командный сценарий архивирования. Имейте в виду, что имя файла журнала, который будет заархивирован, постоянно меняется. Команда архивирования также должна знать, куда вы архивируете файл.