Como no tiene suficiente espacio para ejecutar un vacío o reconstruir, siempre puede reconstruir sus bases de datos postgresql al restaurarlas. Restaurar las bases de datos, tablas, índices liberará espacio y desfragmentará. Luego, puede configurar el mantenimiento automatizado para aspirar sus bases de datos de forma regular.
1 Haga una copia de seguridad de todas las bases de datos en su servidor postgresql
Deberá hacer una copia de seguridad de todas sus bases de datos en una partición que tenga suficiente espacio. Si estaba en Linux, puede usar gzip para comprimir aún más la copia de seguridad para ahorrar espacio
su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz
2 Copia de seguridad de sus archivos de configuración
cp /path/to/postgresql/data_directory/*.conf /some/partition/
3 Detener Postgresql
pg_ctl -D /path/to/postgresql/data_directory stop
4 borra el contenido del directorio de datos
rm -Rf /path/to/postgresql/data_directory/*
5 Ejecute initdb para reinitalizar su directorio de datos
initdb -D /path/to/postgresql/data_directory
6 Restaurar archivos de configuración
cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf
7 Iniciar Postgresql
pg_ctl -D /path/to/postgresql/data_directory start
8 Restaura el volcado de todas las bases de datos que hiciste
gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out
gzip
parte para ahorrar tiempo.NOTA: He probado esto en 9.1. No tengo un servidor 9.0 por aquí. Sin embargo, estoy bastante seguro de que funcionará en 9.0.
PRECAUCIÓN (Como se señaló en los comentarios de @erny):
Puede hacer esto prácticamente sin tiempo de inactividad utilizando un espacio de tabla temporal. El tiempo de inactividad será en forma de bloqueos exclusivos. Pero solo en la mesa estás aspirando. Entonces, todo lo que sucederá es que las consultas de los clientes simplemente esperarán a que se obtenga el bloqueo si acceden a la tabla en cuestión. No necesita cerrar las conexiones existentes.
Sin embargo, una cosa a tener en cuenta es que mover la mesa y la aspiradora por completo deberán esperar primero un bloqueo exclusivo.
Primero, obviamente necesitas algo de almacenamiento adicional. Como se
Stéphane
menciona en los comentarios, esto debe ser al menos dos veces más grande que la tabla en cuestión, al igualVACUUM FULL
que una copia completa. Si tiene suerte y puede agregar dinámicamente un disco a la máquina, hágalo. ¡En el peor de los casos, solo puede conectar un disco USB (aunque arriesgado y lento)!A continuación, monte el nuevo dispositivo y póngalo a disposición como espacio de tabla:
Puede enumerar los espacios de tabla fácilmente usando:
Vuelva a verificar el espacio de tabla actual de su tabla (necesita saber dónde moverlo de nuevo):
Si es así
NULL
, estará en el espacio de tabla predeterminado:Si eso es
NULL
así, probablemente lo serápg_default
(consulte los documentos oficiales en caso de que se modifique).Ahora mueva la mesa sobre:
Aspirarlo:
Muévelo hacia atrás:
Eliminar el espacio temporal:
fuente
size of table x 2
, ya queVACUUM FULL
está haciendo una copia completa de la tabla.Rápido y sucio:
P.ej,:
$ 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
fuente
Si tiene espacio en el disco para realizar un volcado y restaurar, debe tener espacio en el disco para hacer un vacíodb --full. El problema es que vacuumdb --full hará una copia de todo el archivo de datos. Entonces, lo que podrías hacer es:
fuente