Как безопасно применить Vacuum на террабайтую БД Postgress?
vacuum - запустить vacuum. В нём нет ничего страшного, если вы не отстрелили себе ноги, то база сама его запускает согласно настройкам.
vacuum full - история очень сильно отдельная, т.к. это ни разу не vacuum.
Места под vacuum full надо под копию таблицы с индексами и на запись этой копии в WAL. То есть теоретически до двукратного объёма.
Поскольку для рабочей базы возможность уйти на сколько-то часов штука неинтересная - vacuum full по большим таблицам не делают.
Есть pg_repack делающий с помощью триггера и чёрной магии копию таблицы (место всё так же нужно свободное), после накатывает изменения в основной таблице и заменяет основную на свежую копию. В целом - то что делает vacuum full, но без тяжёлой блокировки таблицы.
Есть pgcompacttable, идущий другим путём. postgresql пытается новые строки размещать в начале таблицы, поэтому фиктивные обновления строк в конце таблицы скорей всего переместятся в начало, а пустые страницы в конце может срезать обычный vacuum. Плюс перестроить индексы (правда не все). Обновление inplace, запас места под копию не требуется. Полную блокировку таблицы конечно тоже не берём.
Автор, начните с изучения темы АвтоВакуума, его можно настроить так, что вам не потребуется больше заморачиваться с ручным вакуумом. Да есть исключения, когда помогает только pg_repack, но это больше экзотика.
Поищите выступления Ильи Космодемьянского на YouTube, у него есть видео, где он эту тему хорошо раскрывает