ПРИМЕЧАНИЕ. Я проверил это на 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;