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):
Note that high CPU load due to I/O operations may be expected.
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 igual VACUUM 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:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
Puede enumerar los espacios de tabla fácilmente usando:
\db
Vuelva a verificar el espacio de tabla actual de su tabla (necesita saber dónde moverlo de nuevo):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Si es así NULL
, estará en el espacio de tabla predeterminado:
SHOW default_tablespace;
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:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
Aspirarlo:
VACUUM FULL mytable;
Muévelo hacia atrás:
-- 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
Eliminar el espacio temporal:
DROP TABLESPACE tempspace;