22.6. Tablespaces #

Los tablespaces en PostgreSQL permiten a los administradores de bases de datos definir ubicaciones en el sistema de archivos donde se pueden almacenar los archivos que representan los objetos de la base de datos. Una vez creado, se puede hacer referencia a un tablespace por su nombre al crear objetos de base de datos.

Al usar tablespaces, un administrador puede controlar la distribución en disco de una instalación de PostgreSQL. Esto es útil al menos de dos maneras. En primer lugar, si la partición o volumen en el que se inicializó el clúster se queda sin espacio y no se puede extender, se puede crear un tablespace en una partición diferente y usarlo hasta que el sistema pueda ser reconfigurado.

En segundo lugar, los tablespaces permiten a un administrador utilizar el conocimiento del patrón de uso de los objetos de la base de datos para optimizar el rendimiento. Por ejemplo, un índice que se utiliza con mucha frecuencia se puede colocar en un disco muy rápido y de alta disponibilidad, como un costoso dispositivo de estado sólido (SSD). Al mismo tiempo, una tabla que almacena datos archivados que se utilizan rara vez o que no son críticos para el rendimiento se podría almacenar en un sistema de disco más barato y lento.

Warning

Aunque se encuentren fuera del directorio de datos principal de PostgreSQL, los tablespaces son una parte integral del clúster de bases de datos y no se pueden tratar como una colección autónoma de archivos de datos. Dependen de los metadatos contenidos en el directorio de datos principal y, por lo tanto, no se pueden asociar a un clúster de bases de datos diferente ni respaldar individualmente. Del mismo modo, si pierdes un tablespace (eliminación de archivos, fallo de disco, etc.), el clúster de bases de datos podría volverse ilegible o incapaz de iniciarse. Colocar un tablespace en un sistema de archivos temporal como un disco RAM pone en riesgo la confiabilidad de todo el clúster.

Para definir un tablespace, usa el comando CREATE TABLESPACE, por ejemplo::

CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';

La ubicación debe ser un directorio existente y vacío que pertenezca al usuario del sistema operativo de PostgreSQL. Todos los objetos creados posteriormente dentro del tablespace se almacenarán en archivos bajo este directorio. La ubicación no debe estar en un almacenamiento extraíble o transitorio, ya que el clúster podría dejar de funcionar si el tablespace falta o se pierde.

Note

Normalmente no tiene mucho sentido crear más de un tablespace por sistema de archivos lógico, ya que no puedes controlar la ubicación de los archivos individuales dentro de un sistema de archivos lógico. Sin embargo, PostgreSQL no impone tal limitación y, de hecho, no es consciente directamente de los límites del sistema de archivos en tu sistema. Simplemente almacena los archivos en los directorios que le indiques que use.

La creación del tablespace en sí debe realizarse como superusuario de la base de datos, pero después de eso puedes permitir que los usuarios ordinarios de la base de datos lo utilicen. Para hacer eso, otórgales el permiso CREATE sobre el mismo.

Las tablas, índices y bases de datos completas se pueden asignar a tablespaces específicos. Para hacerlo, un usuario con el permiso CREATE sobre un tablespace dado debe pasar el nombre del tablespace como parámetro al comando correspondiente. Por ejemplo, el siguiente comando crea una tabla en el tablespace space1:

CREATE TABLE foo(i int) TABLESPACE space1;

Alternativamente, usa el parámetro default_tablespace:

SET default_tablespace = space1;
CREATE TABLE foo(i int);

Cuando default_tablespace se establece en cualquier valor que no sea una cadena vacía, suministra una cláusula TABLESPACE implícita para los comandos CREATE TABLE y CREATE INDEX que no tengan una explícita.

También existe el parámetro temp_tablespaces, que determina la ubicación de las tablas temporales y los índices, así como de los archivos temporales que se utilizan para propósitos como ordenar conjuntos de datos grandes. Esto puede ser una lista de nombres de tablespaces, en lugar de uno solo, de modo que la carga asociada con los objetos temporales se pueda repartir entre múltiples tablespaces. Se elige un miembro aleatorio de la lista cada vez que se va a crear un objeto temporal.

El tablespace asociado a una base de datos se utiliza para almacenar los catálogos del sistema de esa base de datos. Además, es el tablespace por defecto utilizado para tablas, índices y archivos temporales creados dentro de la base de datos, si no se proporciona una cláusula TABLESPACE y no se especifica ninguna otra selección por medio de default_tablespace o temp_tablespaces (según corresponda). Si se crea una base de datos sin especificar un tablespace para ella, utiliza el mismo tablespace que la base de datos plantilla de la que se copia.

Se crean automáticamente dos tablespaces cuando se inicializa el clúster de bases de datos. El tablespace pg_global se utiliza únicamente para los catálogos compartidos del sistema. El tablespace pg_default es el tablespace por defecto de las bases de datos template1 y template0 (y, por lo tanto, será el tablespace por defecto para otras bases de datos también, a menos que sea anulado por una cláusula TABLESPACE en CREATE DATABASE).

Una vez creado, un tablespace se puede usar desde cualquier base de datos, siempre que el usuario que lo solicite tenga permisos suficientes. Esto significa que un tablespace no se puede eliminar hasta que todos los objetos en todas las bases de datos que usan el tablespace hayan sido eliminados.

Para eliminar un tablespace vacío, usa el comando DROP TABLESPACE.

Para determinar el conjunto de tablespaces existentes, examina el catálogo del sistema pg_tablespace, por ejemplo:

SELECT spcname, spcowner::regrole, pg_tablespace_location(oid) FROM pg_tablespace;

Es posible averiguar qué bases de datos usan qué tablespaces; consulta Table 9.76. El metacomando \db del programa psql también es útil para listar los tablespaces existentes.

El directorio $PGDATA/pg_tblspc contains enlaces simbólicos que apuntan a cada uno de los tablespaces no integrados definidos en el clúster. Aunque no se recomienda, es posible ajustar la distribución de los tablespaces a mano redefiniendo estos enlaces. Bajo ninguna circunstancia realices esta operación mientras el servidor esté en ejecución.