PostgreSQL: DELETE не освобождает память

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

Любые идеи о том, как освободить место без случайного удаления вещей? Я могу позволить себе потерять некоторые данные из прошлого, но я не могу сделать это на самом деле, так как для ПОЛНОЙ ВАКУУМНОЙ ОЧИСТКИ недостаточно места.


person MrB    schedule 04.05.2011    source источник
comment
См. ответы ниже, но общее примечание: если вы запускаете базу данных PostgreSQL в стиле OLTP общего назначения, а ваш диск заполнен, вы облажались. Добавьте мониторинг и оставьте немного свободного места на диске для таких ситуаций.   -  person Peter Eisentraut    schedule 04.05.2011


Ответы (3)


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

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

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

person DerfK    schedule 04.05.2011
comment
Проблема в том, что я подключен к встроенной системе через модем 56k ... поэтому резервное копирование нескольких сотен мегабайт БД невозможно (отключайтесь каждые несколько минут из-за плохого соединения). И на самом деле есть только 1 таблица, требующая много места, поэтому я не могу сначала очистить самую маленькую таблицу - есть только одна, в которой есть все данные. - person MrB; 04.05.2011
comment
О, одна идея: есть так называемые контрольные точки из Write Ahead Lock (или что-то в этом роде), которые занимают много места (всего несколько 100 МБ). Можно ли как-то удалить эти чекпоинты? Этого должно быть достаточно. - person MrB; 04.05.2011
comment
@MrB файлы журнала с опережающей записью — это место, где postgresql хранит данные, которые еще не были записаны в базу данных, если вы не используете архивирование, он повторно использует одни и те же файлы в цикле, поэтому даже после контрольной точки (где он берет данные из WAL и записывает их в файлы БД) вы не можете просто удалить файлы. Какова ваша настройка checkpoint_segments в postgresql.conf? - person DerfK; 04.05.2011
comment
@MrB, есть ли у вас другое пространство, которое можно использовать на устройстве, может быть, в другом разделе? Поскольку это встроенная система, я предполагаю, что оперативной памяти недостаточно для создания виртуального диска, который может хранить что-то достаточно долго, чтобы выполнить вакуум (хотя вы потеряете все, что было, если система выйдет из строя во время работы в ОЗУ). - person DerfK; 05.05.2011

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

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

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

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

person Quassnoi    schedule 04.05.2011

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

person Andrew Lazarus    schedule 05.05.2011