вакуумные временные файлы postgreSQL?
-
21-09-2019 - |
Вопрос
У меня есть «маленькая» проблема.Неделю назад моя база данных достигла полной емкости диска.Я удалил много строк в разных таблицах, пытаясь освободить место на диске.После этого я попытался запустить полный вакуум, но он не завершился.
Вот что я хочу знать.Когда я остановил пылесос от полного завершения, остались ли на диске какие-либо временные файлы, которые мне пришлось удалить вручную?Теперь у меня есть база данных, емкость диска которой составляет 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, которому нужно столько же свободного дискового пространства, сколько и самой таблице, чтобы все перестроить и устранить эту проблему.