Поскольку у вас недостаточно места для запуска vacumm или восстановления, вы всегда можете восстановить свои базы данных 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
gzip
часть, чтобы сэкономить время.ПРИМЕЧАНИЕ. Я проверил это на 9.1. У меня нет сервера 9.0 валяется здесь. Я уверен, что он будет работать на 9.0, хотя.
ВНИМАНИЕ (как отмечено в комментариях @erny):
Вы можете сделать это практически без простоев, используя временное табличное пространство. Простои будут в виде эксклюзивных замков. Но только на столе вы пылесосите. Таким образом, все, что произойдет, - это то, что клиентские запросы будут просто ждать получения блокировки, если они получат доступ к рассматриваемой таблице. Вам не нужно закрывать существующие соединения.
Однако следует помнить, что для перемещения стола и полного вакуума в первую очередь потребуется подождать эксклюзивной блокировки!
Во-первых, вам, очевидно, нужно дополнительное хранилище. Как
Stéphane
упоминается в комментариях, это должно быть как минимум вдвое больше, чем рассматриваемая таблица, какVACUUM FULL
и полная копия. Если вам повезло, и вы можете динамически добавить диск к машине, сделайте это. В худшем случае вы можете просто подключить USB-диск (хотя и рискованно и медленно)!Далее, смонтируйте новое устройство и сделайте его доступным как табличное пространство:
Вы можете легко перечислить табличные пространства, используя:
Дважды проверьте текущее табличное пространство вашей таблицы (вам нужно знать, куда ее перенести):
Если это так
NULL
, он будет в табличном пространстве по умолчанию:Если что это
NULL
так, то, вероятно , будетpg_default
(проверьте официальные документы в случае , если он изменен).Теперь переместите стол:
Вакуум это:
Переместите это назад:
Удалить временное пространство:
источник
size of table x 2
, посколькуVACUUM FULL
создается полная копия таблицы.Быстро и грязно:
Например,:
$ 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
источник
Если у вас есть место на диске для выполнения дампа и восстановления, у вас должно быть место на диске для создания вакуума db --full. Проблема в том, что вакуумный файл db --full сделает копию всего файла данных. Итак, что вы могли бы сделать:
источник