Як відновити місце на диску на 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.