Вопрос

У меня есть «маленькая» проблема.Неделю назад моя база данных достигла полной емкости диска.Я удалил много строк в разных таблицах, пытаясь освободить место на диске.После этого я попытался запустить полный вакуум, но он не завершился.

Вот что я хочу знать.Когда я остановил пылесос от полного завершения, остались ли на диске какие-либо временные файлы, которые мне пришлось удалить вручную?Теперь у меня есть база данных, емкость диска которой составляет 100%, что, разумеется, является большой проблемой.

Есть какие-нибудь советы по освобождению места на диске?

Я использую SUSE с базой данных Postgres 8.1.4.

Это было полезно?

Решение

Прежде всего:

ОБНОВЛЕНИЕ

Даже если вы не можете установить 8.2, 8.3 или 8.4 - хотя бы обновитесь до новейшей версии 8.1 (на данный момент это 8.1.17, но через 1-2 дня будет 8.1.18).

Второй:диагностируйте, в чем проблема.

Использовать ты инструмент для диагностики, куда именно делось пространство.Какой каталог занимает слишком много места?

Проверить с дф каково общее используемое пространство, а затем проверьте, сколько из него занимает каталог PostgreSQL.

Лучший вариант:

cd YOUR_PGDATA_DIR
du -sk *
cd base
du -sk *
cd LARGEST DIR FROM PREVIOUS COMMAND
du -sk * | sort -nr | head

Теперь, когда вы знаете, какой каталог в PGDATA использует пространство, вы можете что-то с этим сделать.

если это логи или pg_temp - перезапустите pg или удалите логи (pg_clog и pg_xlog не являются логами в обычном понимании этого слова, никогда ничего оттуда не удаляйте!).

Если это что-то в вашем базовом каталоге, то:

числовые каталоги в базовом каталоге относятся к базам данных.Вы можете проверить это с помощью:

select oid, datname from pg_database;

Когда вы узнаете базу данных, которая использует большую часть пространства, подключитесь к ней и проверьте, какие файлы используют большую часть пространства.

Имена файлов будут числовыми с необязательным суффиксом «.digits» — этот суффикс (на данный момент) не имеет значения, и вы можете проверить, что именно представляет собой файл, выполнив:

select relname from pg_class  where relfilenode = <NUMBER_FROM_FILE_NAME>;

Как только вы узнаете, какие таблицы/индексы используют большую часть пространства, вы можете ПОЛНОСТЬЮ ОЧИСТИТЬ их или (гораздо лучше) выдать КЛАСТЕР командуйте ими.

Другие советы

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

Обратите внимание, что удаление большого количества строк, но недостаточно частая очистка, чтобы контролировать дисковое пространство, часто приводит к состоянию, называемому раздуванием индекса, с которым VACUUM FULL вообще не помогает.Вы поймете, что находитесь там, когда предложенный мной запрос покажет, что большую часть вашего пространства занимают индексы, а не обычные таблицы.Вам понадобится CLUSTER, которому нужно столько же свободного дискового пространства, сколько и самой таблице, чтобы все перестроить и устранить эту проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top