Мені потрібно запустити VACUUM FULL без вільного місця на диску


27

У мене є одна таблиця, яка займає близько 90% hd місця на нашому сервері. Я вирішив скинути кілька стовпців, щоб звільнити місце. Але мені потрібно повернути простір в ОС. Проблема, однак, полягає в тому, що я не впевнений, що станеться, якщо я запускаю VACUUM FULL і не вистачає вільного місця, щоб зробити копію таблиці.

Я розумію, що VACUUM FULL не слід використовувати, але я вважав, що це найкращий варіант у цьому сценарії.

Будь-які ідеї будуть вдячні.

Я використовую PostgreSQL 9.0.6

Відповіді:


19

Оскільки у вас не вистачає місця для запуску вакууму чи відновлення, ви завжди можете відновити свої бази даних postgresql, відновивши їх. Відновлення баз даних, таблиць, індексів звільнить простір та дефрагментацію. Після цього ви можете налаштувати автоматичне обслуговування для регулярного завантаження баз даних.

1 Зробіть резервну копію всіх баз даних на вашому сервері postgresql

Ви хочете створити резервну копію всіх ваших баз даних на розділі, який має достатньо місця. Якщо ви працювали в Linux, ви можете використовувати gzip для подальшого стиснення резервної копії для економії місця

su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz

2 Зробіть резервну копію файлів конфігурації

cp /path/to/postgresql/data_directory/*.conf /some/partition/

3 Зупиніть Postgresql

pg_ctl -D /path/to/postgresql/data_directory stop

4 видаліть вміст каталогу даних

rm -Rf /path/to/postgresql/data_directory/*

5 Запустіть initdb, щоб повторно використовувати каталог ваших даних

initdb -D /path/to/postgresql/data_directory

6 Відновіть конфігураційні файли

cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 

7 Почніть Postgresql

pg_ctl -D /path/to/postgresql/data_directory start

8 Відновіть дамп усіх створених вами баз даних

gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out

1
Дякую, це я закінчила з кількома відмінностями. Я просто скинув базу даних після її резервного копіювання. Потім створив новий і відновив його.
Джастін

Ласкаво просимо. Я подумав, що видалення вмісту каталогу даних і виконання initdb було б достатньо.
Крейг Ефрейн

Працювало чудово, я просто рекомендую пропустити gzipчастину, щоб заощадити час.
Рафаель Барбоса

17

ПРИМІТКА: Я перевірив це 9.1. У мене тут не лежить сервер 9.0. Я впевнений, що він працює на 9.0, хоча.


ОБЕРЕЖНО (Як зазначається у коментарях @erny):

Note that high CPU load due to I/O operations may be expected.

Ви можете зробити це майже без простою, використовуючи тимчасовий простір таблиць. Простій буде у вигляді ексклюзивних замків. Але тільки на столі ви пилососите. Отже, все, що відбудеться, - це те, що запити клієнтів будуть просто чекати придбання блокування, якщо вони отримають доступ до відповідної таблиці. Вам не потрібно закривати наявні з'єднання.

Але слід пам’ятати про те, що для переміщення столу та повного вакууму потрібно спочатку дочекатися ексклюзивного блокування!


По-перше, вам очевидно потрібне додаткове зберігання. Як Stéphaneзазначається в коментарях, це повинно бути принаймні вдвічі більшим, ніж таблиця, про яку йдеться, як VACUUM FULLі повна копія. Якщо вам пощастило і ви можете динамічно додати диск до машини, зробіть це. У гіршому випадку ви можете просто підключити USB-диск (хоча ризиковано і повільно)!

Далі встановіть новий пристрій і зробіть його доступним у вигляді простору таблиць:

CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';

Ви можете легко перерахувати простори таблиць, використовуючи:

\db

Двічі перевірте поточний простір таблиці вашої таблиці (потрібно знати, куди повернути її назад):

SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';

Якщо це так NULL, воно буде в просторі таблиць за замовчуванням:

SHOW default_tablespace;

Якщо що це NULLтак, то, ймовірно , буде pg_default(перевірте офіційні документи в разі , якщо він змінений).

Тепер перемістіть таблицю:

ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT;  -- if autocommit is off

Пилосос:

VACUUM FULL mytable;

Перемістіть його назад:

-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT;  -- if autocommit is off

Видаліть тимчасовий простір:

DROP TABLESPACE tempspace;

Зверніть увагу: схоже, що для цього ходу використовується більше місця на диску в оригінальному каталозі даних ...
Кріс Вітерс

Просто перевірив його на 9.3, і він працює як шарм.
Bartek Jablonski

Успішно використовується у виробництві 9.1. Після зміни простору таблиць звільняється вихідний використаний простір. Зауважте, що очікується високе завантаження процесора внаслідок операцій вводу / виводу.
erny

2
Дивовижні поради, дякую за це детальне пояснення. Зауважте, що у тимчасовому просторі таблиць вам знадобиться щонайменше size of table x 2, оскільки VACUUM FULLце повна копія таблиці.
Стефан

Спасибі @ Stéphane Я додав інформацію до основного корпусу.
ексгума

2

Швидкий і брудний:

  • Зупиніть Postgres
  • Перемістіть основний каталог баз даних на інший диск, де достатньо місця для пилососи
  • У початковому розташуванні основного додайте символьне посилання до нового місця розташування
  • Вакуум
  • Видаліть символьне посилання та перемістіть головний каталог назад у його початкове місце
  • Почніть Postgres

Наприклад,:

$ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start


0

Якщо у вас є дисковий простір для скидання та відновлення, у вас має бути дисковий простір, щоб зробити вакуумний - повний. Проблема полягає в тому, що vacudb --повністю зробить копію всього файлу даних. Отже, що ви можете зробити:

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