PostgreSQL: дисковое пространство не освобождается после TRUNCATE

12

Я TRUNCATEсделал огромную (~ 120 Гб) таблицу под названием files:

TRUNCATE files;
VACUUM FULL files;

Размер таблицы равен 0, но дисковое пространство не было освобождено. Любые идеи, как восстановить мое потерянное дисковое пространство?

ОБНОВЛЕНИЕ: Дисковое пространство было освобождено через ~ 12 часов, без каких-либо действий с моей стороны. Я использую сервер Ubuntu 8.04.

Адам Матан
источник
Я собирался предложить «пропылесосить это!», Но, учитывая, что вы только что это сделали, я бы посоветовал перенести это в один из списков pg-hackers или pg-performance (и ссылаться на ветку или ответ, как только вы получите один).
Дени де Бернарди
Эта ссылка ( postgresql.1045698.n5.nabble.com/… ) дает какой-либо совет для вас? Может быть, есть еще что-то доступ к таблице или тому подобное.
DrColossos
@DrColossos: я прочитал комментарий в источнике (комментарий, который сейчас не могу найти), в котором говорится, что PostgreSQL уведомляет все соединения о том, что должно произойти усечение, и блокирует необходимые ресурсы. (Их несколько, включая саму таблицу, индексы, последовательности и таблицы тостов.) Я почти уверен, что раньше нашел комментарий, проследив через ExecuteTruncate (), но я не уверен на 100% об этом.
Майк Шеррилл 'Cat Recall'

Ответы:

12

Согласно комментариям в источнике , truncateсоздает новый пустой файл хранилища и удаляет старый файл хранилища во время фиксации. (Документы предполагают, что «файл хранилища» - это просто файл, если говорить об ОС, но я могу неправильно понимать терминологию.)

Создайте новый пустой файл хранилища для отношения и назначьте его в качестве значения relfilenode. Старый файл хранилища планируется удалить при фиксации.

Поскольку кажется, что он удаляет файл, я могу представить некоторые случаи, когда базовая операционная система не сразу освобождает это пространство. Я полагаю, что в некоторых случаях файл хранилища может оказаться, например, в Корзине под Windows. Но в моем случае усечение таблицы в PostgreSQL 9. что-то сразу увеличило свободное пространство под Windows.

Усечение также записывается в журнал WAL. Я не знаю, какой эффект это может оказать.

Майк Шеррилл 'Cat Recall'
источник
2
Вполне возможно, что другой бэкэнд-процесс все еще имеет дескриптор файла для открытия файла. Если это произойдет снова, я бы попытался завершить все остальные процессы бэкэнда, просто чтобы увидеть, имеет ли это значение.
Питер Айзентраут
Я почти уверен, что прочитал, что ExecuteTruncate () должен быть уверен, что этого не произойдет. Вся часть блокировки ресурсов необходима для того, чтобы в итоге удалить старый файл хранилища. Но я не знаю, где я нашел это в источнике. Я просто просматриваю это онлайн; так легко заблудиться.
Майк Шеррилл 'Cat Recall'