REPACK в PostgreSQL 19: перепаковка в ядре и, как всегда, дьявол в деталях

lesovsky 23 минуты назад REPACK в PostgreSQL 19: перепаковка в ядре и, как всегда, дьявол в деталях Средний 9 мин 1.1K PostgreSQL * Системное администрирование * Базы данных * Кейс Мы (ну ладно, я) ждали этого больше...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: lesovsky 23 минуты назад REPACK в PostgreSQL 19: перепаковка в ядре и, как всегда, дьявол в деталях Средний 9 мин 1. 1K PostgreSQL * Системное администрирование * Базы данных * Кейс Мы (ну ладно, я) ждали этого больше десяти лет: в PostgreSQL 19 наконец-то завезли штатную онлайн-перепаковку таблиц. Команда REPACK в ядре и теперь больше никаких сторонних расширений и бесконечных согласований с ИБ.
Эпоха pg_repack подошла к концу? Спойлер: не спешите удалять старые скрипты и утилиты. На моих тестах новая встроенная команда под нагрузкой заблокировала таблицу на три с лишним минуты, в то время как "старичок" pg_repack уложился в 0.
Технические детали
Выяснил: как устроен новый REPACK под капотом, почему он ломает привычный MVCC и в каких сценариях попытка использовать штатный инструмент на проде станет фатальной ошибкой. Статья написана по PostgreSQL 19beta2. Это бета, детали поведения к релизу могут измениться.
Зачем вообще нужна перепаковкаВ условиях интенсивной записи таблица растёт быстрее, чем объём полезных данных. Каждое обновление строки порождает новую версию, старая становится мёртвой, autovacuum её вычищает, но место в файловой системе не возвращается. Освободившееся пространство переиспользуется внутри файла для новых версий строк.
Масштаб проблемы легко увидеть на стенде. Берём таблицу pgbench_accounts (стандартный тест TPC-B pgbench) на 40 млн строк (5. 1 ГБ), обновляем первые 90% строк.
Отраслевые последствия
Новые версии уезжают в хвост, файл раздувается до 9. Запускаем обычный VACUUM: четыре минуты работы, 36 млн мёртвых строк вычищено, возвращено 0 байт. По pgstattuple в файле 47.
95% свободного места, половина таблицы пустует, но диск считает её занятой. Штатный VACUUM тут нам не поможет, нужны другие варианты. Чем перепаковывали до сих порСамый простой вариант — VACUUM FULL.
Он переписывает таблицу в новый файл, надёжен и встроен, но всё время работы удерживает ACCESS EXCLUSIVE: таблица недоступна ни для чтения, ни для записи. В случае с 10 ГБ это минуты, в случае сотен — часы. Инструменту нужно согласованное окно обслуживания.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






