ПРИМІТКА: Я перевірив це 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;