#database #postgresql #postgresql-13
#База данных #postgresql #postgresql-13
Вопрос:
Основной вопрос:
archive_cleanup_command в файле postgresql.conf не очищает архивированные файлы wal. Как я могу заставить его очистить архивированные файлы wal?
Соответствующая информация:
- Моя ОС — Linux, Ubuntu версии 18.04 LTS.
- База данных — Postgresql версии 13
Мои текущие настройки:
файл /etc/postgresql/13/main/postgresql.conf:
wal_level = replica
wal_compression = on
wal_recycle = on
checkpoint_timeout = 5min
max_wal_size = 1GB
min_wal_size = 80MB
archive_mode = on
archive_command = 'pxz --compress --keep --force -6 --to-stdout --quiet %p > /datadrive/postgresql/13/wal_aerchives/%f.xz'
archive_timeout = 10min
restore_command = 'pxz --decompress --keep --force -6 --to-std-out --quiet /datadrive/postgresql/13/wal_archives/%f.xz > %p'
archive_cleanup_command = 'pg_archivecleanup -d -x .xz /datadrive/postgresql/13/wal_archives %r >> /datadrive/postgresql/13/wal_archives/archive_cleanup_command.log 2>amp;1'
archive_cleanup_command.журнал имеет 777 разрешений.
У меня есть главная база данных, выполняющая логическую репликацию с публикацией, и подчиненная база данных, подписавшаяся на эту публикацию. Именно на подчиненном устройстве я намереваюсь выполнить точки архивирования и восстановления.
Чего я ожидаю?
Настройка времени ожидания контрольной точки в файле postgresql.conf означает, что точка перезапуска создается по крайней мере каждые 5 минут. А параметр archive_timeout, равный 10 минутам, означает, что postgresql принудительно переключает сегмент файла журнала через каждые 10 минут. Поэтому, по крайней мере, каждые 10 минут создается точка перезапуска. Всякий раз, когда создается точка перезапуска, выполняется команда очистки архива. При выполнении этой команды будут удалены все файлы .xz, более старые, чем эта точка перезапуска. Поэтому в каталоге wal_archives не должно быть файлов .xz старше 20 минут или даже 2 часов….
Что происходит на самом деле?
-
В
/datadrive/postgresql/13/wal_archives
каталоге скопилось множество файлов .xz, которые никогда не очищаются. -
cat archive_cleanup_command.log
показывает пустой файл. В него никогда ничего не записывается. -
Когда я запускаю команду pg_archivecleanup вручную через bash, она работает (т.е. Очищает все архивные файлы до указанного, а cat archive_cleanup_command показывает файлы, которые были очищены.
Пример:pg_archivecleanup -d -x .xz /datadrive/postgresql/13/wal_archives 000000010000045E000000E5 >> /datadrive/postgresql/13/wal_archives/archive_cleanup_command.log 2>amp;1
Затем запуск
cat archive_cleanup_command.log
дает это:pg_archivecleanup: keeping WAL file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E5" and later pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000DE.xz" pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000DF.xz" pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E0.xz" pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E1.xz" pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E2.xz" pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E3.xz" pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E4.xz"
Что я пробовал?
-
Я пробовал различные настройки разрешений (примеры: chmod 777 каталог wal_archive, добавление других пользователей в группу postgres и т. Д.)
-
Подробно и тщательно прочитайте документацию postgresql и просмотрели по крайней мере 20 различных связанных сообщений stackoverflow.
-
Изначально пробовал 7zip cmd line tool для архивирования вместо pxz.
-
Успешный перезапуск базы данных несколько раз с помощью следующих команд:
sudo systemctl stop postgresql@13-main sudo systemctl start postgresql@13-main
-
Отбросил логическую репликацию и заново создал публикацию на главном сервере и подписку на подчиненном.
-
Включены контрольные точки на самом главном сервере.
-
Посмотрел
/var/log/postgresql/postgresql-13-main.log
. К сожалению, в этом журнале не отображаются соответствующие ошибки.
Комментарии:
1. в pxz нет опции «—to-std-out».
2. Вы просмотрели файл журнала на реплике или только на главном сервере?
3. @jjanes pxz Я считал опцию —to-std-out допустимой опцией для pxz, поскольку в документации указано, что она совместима с xz. Документы, на которые я ссылаюсь, находятся здесь linux.die.net/man/1/pxz и здесь linux.die.net/man/1/xz . Часть архивирования была протестирована в моей системе, и я могу подтвердить, что она работает.
4. @LaurenzAlbe Извините, я пропустил тот факт, что он должен быть в режиме восстановления. Я не в режиме восстановления. Моя настройка — это стандартная настройка с приведенными выше настройками. У меня есть главная база данных, выполняющая логическую репликацию с публикацией, и подчиненная база данных, подписавшаяся на эту публикацию. Именно на подчиненном устройстве я намереваюсь выполнить точки архивирования и восстановления. Я новичок в базах данных и плохо понимаю, как работают точки восстановления и перезапуска в pgsql. Есть ли какие-либо хорошие источники в Интернете, о которых вы знаете, которые могут помочь мне начать в правильном направлении?
5. @jjanes Я просмотрел файл журнала в реплике, поскольку именно там я пытаюсь настроить архив и точки перезапуска, и именно там я успешно настроил архивную систему. Я ничего не делал с главной базой данных.
Ответ №1:
Точки restore_command
перезапуска и archive_cleanup_command
применяются только к потоковой («физической») репликации или к восстановлению в целом, а не к логической репликации.
Резервная логическая репликация не восстанавливается, она открыта для чтения и записи. В этом состоянии параметры восстановления, подобные archive_cleanup_command
игнорируются.
Вам нужно будет найти другой механизм для удаления старых архивов WAL, в идеале в сочетании с вашим решением для резервного копирования.
Комментарии:
1. Большое вам спасибо, Лоренц! Ты лучший.