Задать вопрос
@GrackHack

Как безопасно применить Vacuum на террабайтую БД Postgress?

БД на проде 1 террабайт. В ней 1 таблица весит 900Гб из нее 300Гб индексы, в ней 500млн записей по 1 кб максимум на запись. Как безопасно сделать VACUUM FULL и сколько потребуется свободного пространства на диске?
  • Вопрос задан
  • 1390 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
vacuum - запустить vacuum. В нём нет ничего страшного, если вы не отстрелили себе ноги, то база сама его запускает согласно настройкам.

vacuum full - история очень сильно отдельная, т.к. это ни разу не vacuum.
Места под vacuum full надо под копию таблицы с индексами и на запись этой копии в WAL. То есть теоретически до двукратного объёма.
Поскольку для рабочей базы возможность уйти на сколько-то часов штука неинтересная - vacuum full по большим таблицам не делают.
Есть pg_repack делающий с помощью триггера и чёрной магии копию таблицы (место всё так же нужно свободное), после накатывает изменения в основной таблице и заменяет основную на свежую копию. В целом - то что делает vacuum full, но без тяжёлой блокировки таблицы.
Есть pgcompacttable, идущий другим путём. postgresql пытается новые строки размещать в начале таблицы, поэтому фиктивные обновления строк в конце таблицы скорей всего переместятся в начало, а пустые страницы в конце может срезать обычный vacuum. Плюс перестроить индексы (правда не все). Обновление inplace, запас места под копию не требуется. Полную блокировку таблицы конечно тоже не берём.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
orlov0562
@orlov0562
I'm cool!
https://www.postgresql.org/docs/current/sql-vacuum.html
Selects "full" vacuum, which can reclaim more space, but takes much longer and exclusively locks the table. This method also requires extra disk space, since it writes a new copy of the table and doesn't release the old copy until the operation is complete. Usually this should only be used when a significant amount of space needs to be reclaimed from within the table.


т.е. надо мимнимум +1 Тб

чтобы сделать все безопасно, тем более на проде, надо отзеркалить базу на другой винт и затем провести чистку там, после чего синхронизировать накопившееся изменения с основной копией, и в конце переключить прод на новую бд
Ответ написан
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Для начала найдите системного архитектора или DBA и дайте ему в глаз. Он поймёт за что.
Ответ написан
Комментировать
AlexeyVi
@AlexeyVi
Linux, MySQL, PostgreSQL, ElasticSearch, HiLoad
Автор, начните с изучения темы АвтоВакуума, его можно настроить так, что вам не потребуется больше заморачиваться с ручным вакуумом. Да есть исключения, когда помогает только pg_repack, но это больше экзотика.
Поищите выступления Ильи Космодемьянского на YouTube, у него есть видео, где он эту тему хорошо раскрывает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы