PostgreSQL: DELETE не освобождает память - PullRequest
0 голосов
/ 04 мая 2011

Я использую PostgreSQL на встроенной системе с ограниченным дисковым пространством. Сейчас БД-накопитель заполнен. Когда я удаляю данные, они не освобождают место. Я пытался VACUUM FULL, но это требует места. Как и удаление последнего оставшегося индекса.

Есть идеи, как освободить место без случайного удаления материала? Я могу позволить себе потерять некоторые данные из прошлого, но, похоже, на самом деле не могу этого сделать, поскольку не хватает места для VACUUM FULL.

Ответы [ 3 ]

1 голос
/ 04 мая 2011

PostgreSQL использует модель MVCC, что означает, что удаленные записи помечают свое пространство как свободное (после того, как транзакция, которая их удалила, была зафиксирована), но она все еще зарезервирована таблицей.

До PostgreSQL 9.0, VACUUM FULL использовался для перемещения данных внутри таблицы без необходимости дополнительного пространства.

В PostgreSQL 9.0 поведение VACUUM FULL изменилось и теперь требует дополнительного места для полной копии таблицы.

Вы можете попытаться удалить индексы из таблиц и очистить их один за другим, начиная с наименее одного.

0 голосов
/ 05 мая 2011

В определенных ситуациях VACUUM (не полный) может освободить место на диске. (Я думаю, что он вернет страницы, которые полностью мертвы для ОС.) Это может освободить достаточно места, чтобы начать с VACUUM FULL. Но не рекомендуется увеличивать размер одной таблицы до объема, свободного от дискового пространства.

0 голосов
/ 04 мая 2011

Самый простой ответ на этом этапе - выгрузить базу данных на другой диск / компьютер (например, используя pg_dump или pg_dumpall, если у вас более одного дБ, и помните о таких вещах, как крупные объекты). которые требуют специальных процессов резервного копирования / восстановления), затем удалите и заново создайте базу данных.

Если осталось немного места, вы можете попробовать vacuum full smallesttable, который может завершить работу и освободить место для очистки следующего наименьшего стола и т. Д.

Если вы закончите заполнять диск полностью, сервер базы данных, вероятно, откажется запускаться, и вы не сможете выполнить ни одно из этих действий. В этом случае вы можете переместить весь каталог данных на другой компьютер с той же архитектурой ЦП и большим количеством дискового пространства, а затем запустить там postgresql для создания вакуума.

...