Страницы

Поиск по вопросам

воскресенье, 1 марта 2020 г.

PostgreSQL. Можно ли очистить очень большую таблицу, если на диске нет места?

#postgresql #администрирование


Собственно, вопрос в заголовке.
PostgreSQL 10. Есть большая таблица на несколько десятков гигабайт и несколько сотен
миллионов записей. А вот места на диске совсем нет (пару сотен мегабайт).

Есть ли какие-нибудь колдовские заклинания, чтобы из этой таблички почистить все
или часть записей, не имея свободного места?
    


Ответы

Ответ 1



Да, колдовские заклинания есть. С полной очисткой таблицы справится truncate, требующий на диске только несколько десятков килобайт (под новую пустую таблицу, индексы, да занести информацию в WAL), но только полная очистка. Если необходимо удалить не всё, но места нет - то необходимо делать: delete всего более ненужного vacuum tablename пустые update нужных строк частями, ничего на самом деле не изменяющие update tablename set column=column where ... такие update пометят строки удалёнными где те были и создадут копию в начале таблицы последующий vacuum tablename сможет возвращать место операционной системе если в конце таблицы остались только пустые страницы без живых данных Основной фокус - придумать как перемещать только строки из конца таблицы. Индексы же только перестраивать. Можно через удаление и построение обратно, раз всё равно авария и места для работы нет. Проблема у этого метода если у вас распухла не сама табличка, а её TOAST часть. Тогда таким способом не лечится. Существует специально обученный perl скрипт pgcompacttable специально написанной для сжатия таблиц в условиях недостатка дискового места и автоматизирующий описанные манипуляции манипуляции.

Комментариев нет:

Отправить комментарий