Очистить журнальные файлы PostgreSQL (закрыть и снова открыть файлы) без перезапуска postgresql?

Вопрос или проблема

Можно ли заставить 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 используйте следующую конфигурацию:

  1. Откройте редактор cron:

    crontab -e
  2. Добавьте следующую строку:

    0 6 * * * rm /path/to/your/postgresql.log
  3. Сохраните изменения и перезапустите службу cron:

    sudo service cron restart

Заключение

Следуя этим рекомендациям, вы сможете эффективно управлять журналами PostgreSQL, не прибегая к его перезапуску, что сохранит стабильность работы вашей системы и позволит поддерживать чистоту дискового пространства. Это важно для поддержания высокого уровня производительности и надежности.

Оцените материал
Добавить комментарий

Капча загружается...