Вопрос или проблема
Можно ли заставить PostgreSQL очистить свои файлы журналов и открыть их заново, без перезапуска? Я попытался отправить сигнал HUP, но это не помогло. У меня случайно получился большой файл журнала postgres, который я удалил с помощью rm
, но postgres все еще имеет этот файл открытым, так что место на диске не освободилось.
У меня PostgreSQL 9.5 на Ubuntu Linux 16.04
Начиная с Postgres 12, есть команда для ротации файлов журналов:
pg_ctl logrotate [-D datadir] [-s]
См. также документацию pg_ctl
Debian (а возможно и другие) имеют pg_ctlcluster, обертку вокруг pg_ctl, упрощающую эту задачу.
Синтаксис:
pg_ctlcluster <version> <cluster> logrotate
Пример для Postgres 17, кластера “main”:
pg_ctlcluster 17 main logrotate
Используйте pg_lsclusters
для просмотра кластеров.
Если вы не хотите, чтобы ваши файлы журналов оставались там периодически, вы можете попробовать cron
.
С помощью этих команд
crontab -e
Затем напишите
# m h dom mon dow command
0 6 * * * rm /somewhere/your/postgresql.log
Затем сохраните это.
sudo service cron restart
Это означает, что ваша система будет удалять журнал в 6:00 утра каждый день.
Ответ или решение
Удаление большого файла журнала PostgreSQL без освобождения дискового пространства является распространенной проблемой, так как система продолжает сохранять данные в уже открытый файл. Для разрешения этой ситуации, не прибегая к перезапуску PostgreSQL, можно воспользоваться механизмом ротации журналов. Рассмотрим шаги, которые помогут вам безопасно и эффективно решить проблему.
Управление логами в PostgreSQL без перезагрузки
Для PostgreSQL версии 9.5, используемой на Ubuntu 16.04, сигнал HUP не помогает с задачей ротации логов. Однако начиная с PostgreSQL 12, функция ротации журналов была значительно упрощена с помощью команды:
pg_ctl logrotate [-D datadir] [-s]
Эта команда автоматически закрывает текущие файлы журналов и создает новые, освобождая старые для удаления и очистки дискового пространства. Дополнительную информацию можно найти в документации pg_ctl.
Использование pg_ctlcluster
На системах Debian и подобных, таких как Ubuntu, можно использовать пакет pg_ctlcluster
, который упрощает управление кластерами PostgreSQL. Пример команды ротации лог-файлов для PostgreSQL 17, кластера "main":
pg_ctlcluster 17 main logrotate
Для проверки доступных кластеров в системе используйте:
pg_lsclusters
Настройка автоматизации с помощью cron
Если вы желаете автоматизировать процесс удаления устаревших логов, можно настроить cron-задачи. Например, для удаления файла журнала каждое утро в 6:00 используйте следующую конфигурацию:
-
Откройте редактор cron:
crontab -e
-
Добавьте следующую строку:
0 6 * * * rm /path/to/your/postgresql.log
-
Сохраните изменения и перезапустите службу cron:
sudo service cron restart
Заключение
Следуя этим рекомендациям, вы сможете эффективно управлять журналами PostgreSQL, не прибегая к его перезапуску, что сохранит стабильность работы вашей системы и позволит поддерживать чистоту дискового пространства. Это важно для поддержания высокого уровня производительности и надежности.