Як відновити місце на диску на PostgreSQL?


25

У мене локальна установка бази даних 9.1 з кількома таблицями, в яких було cca. 300 записів на міо та база даних зросла приблизно до 20 ГБ. Потім я видав delete fromкоманду видалити всі записи з неї (я повинен був використовувати truncate, але я цього не знав). Тому я зробив повний вакуум на своєму db, щоб повернути місце на диску, але це просто не допомагає. Моя проблема виглядає ідентично цій , але рішення не передбачено. Я вже перевірив цю тему та документацію щодо "відновлення дискового простору" , але досі не можу знайти рішення. Я використовую цей код, щоб отримати розмір усіх таблиць

 SELECT nspname || '.' || relname AS "relation",
 pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
 FROM pg_class C
 LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE nspname NOT IN ('pg_catalog', 'information_schema')
 AND C.relkind <> 'i'
 AND nspname !~ '^pg_toast'
 ORDER BY pg_total_relation_size(C.oid) DESC
 LIMIT 15;

Однак на суму менше 1 Гб

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database 

все ще показує близько 20 ГБ. Будь-яка порада дуже цінується.


Ну, ваш запит щодо розміру виключає: індекси, таблиці в pg_catalogта таблиці в information_schema. Тому спробуйте перевірити, чи є це хтось із цих, видаливши ці обмеження в WHEREпункті. Покажіть, будь ласка, вашу точну версію PostgreSQL ( SELECT version()) і що саме ви робите для "вакуумування повної бази даних", тобто точної команди. Якщо можливо, запустіть VACUUM FULL VERBOSE;(без аргументів) і вставте результат десь, а потім посилання на нього тут.
— Крейг Рінгер

Спробуйте скинути базу даних. Ви також можете спробувати скинути базу даних, а потім відновлення її скине сміття.
— jb.

1
@jb Це працювало б, але не повинно бути необхідним. Краще дізнатися, в чому проблема.
— Крейг Рінгер

Відповіді:


22

Хоча ви цього не заявляли, я вважаю, що ви посилаєтесь на документи, які ви слідували, що ви виконали ВАКУУМ ПОВНО в базі даних та / або таблицях, на які це стосується. Ви також не вказали, яку версію postgresql використовуєте - я вважаю, що це> 9,0 (до цього VACUUM FULL поводився інакше).

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

Якщо це практично, перезапуск бази даних забезпечить закриття всіх відкритих файлів.

Якщо це не практично, ви, можливо, зможете перевірити, чи це ваша проблема, і дізнатися, у якому процесі відкриті файли.

Якщо ви використовуєте Linux (або більшість інших подібних Unix систем), ви можете скористатися командою 'lsof', щоб отримати список усіх файлів, відкритих у всіх процесах. Файли, які відкрито, але з тих пір були видалені, до імені файлу додадуть "(видалено)". Отже, ви можете зібрати висновок lsof, шукаючи видалені файли, наприклад:

sudo lsof -u postgres | grep 'deleted'

Якщо це ідентифікує процеси, у яких все ще відкриті старі файли, ви можете використовувати pg_terminate_backend для завершення цього процесу:

SELECT pg_terminate_backend(xxx);

де xxx - PID процесу, знайдений у висновку lsof.

Якщо використовується Windows, може застосовуватися той самий принцип, оскільки postgres відкриває файли, використовуючи прапор FILE_SHARE_DELETE, що дозволяє йому видаляти файли, відкриті в іншому процесі. Команда ' handle ' - це приблизний еквівалент lsof, хоча я не впевнений, чи можете ви сказати, видалені файли чи ні, тому може знадобитися деяка додаткова робота.

Ще одне питання, чому будь-які подібні процеси будуть зациклюватися на старих ручках файлів. Однак у темі, яку ви цитували у своєму запитанні, Том Лейн, здається, передбачає, що це може статися.


Мені довелося терміново повернути простір на диску, щоб я скинув базу даних і відновив її з резервного копіювання. Однак питання "як" вирішити це питання все ще має велике значення для майбутніх справ. Моя база даних 9.1, виграє 8 64 біт, чи називається файл (випадок відкритих файлів) так само, як у Linux?

@arcull Добре, я не розумів, що ви використовуєте Windows. Я додав інформацію у відповідь про те, як це стосується Windows. Якщо ви думаєте, що це може бути корисною відповіддю, будь ласка, подумайте про те, щоб подати заявку, оскільки це полегшує пошук інших.
— шкідливий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.