← Назад к вопросам

Сколько часов живет один WAL по умолчанию?

2.0 Middle🔥 141 комментариев
#Базы данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ: Время жизни WAL (Write-Ahead Log) по умолчанию

В PostgreSQL, по умолчанию, один файл WAL (Write-Ahead Log) не имеет фиксированного "часового" времени жизни. Вместо этого его "жизнь" управляется на основе размера и выполнения контрольных точек (checkpoints). Однако, если перефразировать вопрос в контексте того, "как долго WAL-файлы хранятся в системе", то ключевыми параметрами будут wal_keep_size (или устаревший wal_keep_segments) и max_wal_size. Прямого параметра "часов" для жизни одного WAL-файла нет.

Ключевые параметры, влияющие на хранение WAL

  1. Размер одного WAL-файла: По умолчанию составляет 16 МБ (задается при инициализации кластера параметром --wal-segsize, обычно равен 1 сегменту). Каждый файл имеет имя вида 000000010000000000000001.
  2. Управление через контрольные точки:
    • max_wal_size (по умолчанию 1 ГБ) – максимальный общий размер WAL-файлов, который может быть создан между контрольными точками. При достижении этого лимита запускается принудительная контрольная точка.
    • min_wal_size (по умолчанию 80 МБ) – минимальный размер, до которого архивные WAL-файлы могут быть сжаты или удалены после контрольной точки.
  3. Репликация и wal_keep_size: Начиная с PostgreSQL 13, параметр wal_keep_size (по умолчанию 0, т.е. не ограничено) определяет, сколько WAL-файлов будет дополнительно храниться сверх необходимых для восстановления, чтобы обеспечить работу реплик. В более старых версиях использовался wal_keep_segments (по умолчанию 0).
  4. Архивация WAL: Если настроен archive_mode = on, то WAL-файлы отправляются в архив (например, в S3 или другую файловую систему) и могут храниться там сколь угодно долго, независимо от параметров выше.

Расчет примерного "времени жизни" WAL-файла

Хотя прямого часового параметра нет, можно оценить время жизни WAL-файла косвенно, исходя из нагрузки на БД.

Допустим:

  • Размер одного WAL-сегмента = 16 МБ.
  • max_wal_size = 1 ГБ (1024 МБ).
  • Между контрольными точками может быть создано примерно 1024 / 16 = 64 WAL-файла.
  • Если нагрузка генерирует WAL со скоростью 100 МБ/час, то общий объем в 1 ГБ будет достигнут за ~10 часов. Тогда один WAL-файл "проживет" до контрольной точки около 10 часов / 64 файла ≈ 9-10 минут в "активном" состоянии. Но это очень упрощенный расчет.

Практический пример с кодом проверки

Чтобы понять текущее состояние WAL в вашей системе, можно выполнить следующие SQL-запросы:

-- Проверить текущий WAL-файл и его расположение
SELECT pg_walfile_name(pg_current_wal_lsn());

-- Посмотреть настройки, связанные с WAL
SELECT name, setting, unit FROM pg_settings 
WHERE name IN ('wal_segment_size', 'max_wal_size', 'min_wal_size', 'wal_keep_size', 'archive_mode');

Вывод может выглядеть так:

        name        | setting | unit
--------------------+---------+------
 wal_segment_size   | 16777216| bytes
 max_wal_size       | 1024    | MB
 wal_keep_size      | 0       | MB
 archive_mode       | off     |

Резюме

  • Один WAL-файл не живет "часами" по умолчанию – его удаление зависит от контрольных точек и настроек хранения.
  • Если wal_keep_size = 0 и нет реплик/архивации, WAL-файлы могут удаляться сразу после контрольной точки (минуты или часы, в зависимости от нагрузки).
  • Для продления хранения WAL нужно настраивать wal_keep_size (для репликации) или archive_mode (для резервного копирования).
  • В продакшн-средах важно мониторить рост WAL через представления pg_stat_archiver и pg_ls_waldir().

Для точного ответа всегда учитывайте: нагрузку на БД, настройки контрольных точек (checkpoint_timeout, max_wal_size), наличие реплик и архивации. Рекомендую явно настраивать wal_keep_size в зависимости от требований к доступности реплик (например, 1 ГБ или больше).

Сколько часов живет один WAL по умолчанию? | PrepBro