Комментарий пользователя
Почему в PostgreSQL базы раздуваются по объему на дисках даже при регулярном удалении старых записей через DELETE? Как правильно обслуживать PostgreSQL, чтобы не разориться на дисках для сервера?
Ответ специалиста
Здравствуйте, Мария! В вашем случае происходит bloat (раздувание) — это состояние, когда таблица занимает на диске значительно больше места, чем реально нужно. Технически это не баг, а фича для реализации транзакционности и MCC в PostgreSQL.
При выполнении запросов UPDATE или DELETE старые версии строк помечаются «мертвыми», но физически остаются в файле на диске. Получается, что чем чаще меняются данные, тем больше пустого места образуется внутри страниц таблицы и индексов. Для работы с этим процессом есть механизм VACUUM и расширение pg_repack.
VACUUM — это команда в PostgreSQL, которая используется для очистки базы данных от неактуальных строк и освобождения занимаемого ими места.
Существует два вида команды:
- VACUUM просто помечает устаревшие строки как доступные для повторного использования и не уменьшает физический размер файлов таблицы;
- VACUUM FULL выполняет очистку и возвращает свободное место обратно операционной системе, уменьшая физический размер файла. Однако этот процесс требует блокировки таблицы, поэтому выполняется дольше и блокирует другие операции.
pg_repack — это расширение для PostgreSQL, которое удаляет мертвые строки, оставшиеся после DELETE и UPDATE. Это позволяет дефрагментировать и компактно переписать таблицу или индекс без блокировки таблицы, в отличие от VACUUM FULL.
Работает расширение по следующему алгоритму: сначала создается временная «чистая» таблица‑копия с индексами, и в нее копируются все актуальные данные. Далее pg_repack следит за всеми изменениями в оригинальной таблице, догоняет произошедшие в ней изменения и переключает имена таблиц (на этом шаге блокировка все-таки производится, но длится она миллисекунды). Наконец, старый bloat‑файл удаляется.
Резюмируя: VACUUM используется для постоянной фоновой гигиены, а pg_repack — это операция «дефрагментации», которая используется, когда bloat уже накопился.
На самом деле основная сложность заключается не в запуске VACUUM или pg_repack, а в мониторинге bloat, выборе частоты обслуживания, минимизации блокировок на продакшене и тюнинге autovacuum под нагрузку.
В наших облачных базах данных эти процессы обычно проще контролировать: обслуживание, мониторинг и эксплуатационные настройки выполняются на уровне платформы, снижая риск деградации производительности из-за накопленного bloat.