22.6. Espaços de tabelas #

Figura 22.2. Espaços de tabelas


Os espaços de tabelas no PostgreSQL permitem que os administradores de banco de dados definam localizações no sistema de arquivos onde os arquivos que armazenam objetos do banco de dados podem ser posicionados. Após ser criado, o espaço de tabelas pode ser referido pelo nome ao criar objetos de banco de dados.

Usando espaços de tabelas, o administrador pode controlar a disposição em disco de uma instalação do PostgreSQL. É útil de pelo menos duas maneiras:

Atenção

Embora estejam localizados fora do diretório de dados principal do PostgreSQL, os espaços de tabelas são parte integrante da instância, não podendo ser tratados como uma coleção autônoma de arquivos de dados. Estes dados dependem dos metadados contidos no diretório de dados principal e, portanto, não podem ser anexados a uma instância diferente, ou ser feita cópia de segurança a parte. Da mesma forma, se for perdido um espaço de tabelas (exclusão de arquivo, falha de disco, etc.), a instância poderá ficar ilegível, ou incapaz de iniciar. Colocar um espaço de tabelas em um sistema de arquivos temporário, como um disco RAM, arrisca a confiabilidade de todo a instância.

Para definir um espaço de tabelas, deve-se usar o comando CREATE TABLESPACE. Por exemplo:

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

O local deve ser um diretório vazio existente, pertencente ao usuário do sistema operacional do PostgreSQL. Todos os objetos criados depois neste espaço de tabelas serão armazenados em arquivos sob este diretório. O local não deverá estar em armazenamento removível ou transitório, porque a instância poderá falhar ao funcionar, se o espaço de tabelas estiver ausente ou perdido.

Nota

Normalmente, não faz muito sentido criar mais de um espaço de tabelas por sistema de arquivos lógico, porque não é possível controlar a localização dos arquivos individuais em um sistema de arquivos lógico. Entretanto, o PostgreSQL não impõe nenhuma limitação e, na verdade, não está diretamente ciente dos limites do sistema de arquivos no sistema. Ele apenas irá armazenar arquivos nos diretórios que se disser para usar.

A criação do próprio espaço de tabelas deve ser feita por um superusuário do banco de dados, mas depois disso pode-se permitir que usuários comuns do banco de dados o usem. Para fazer isto, deve ser-lhes concedido o privilégio CREATE no espaço de tabelas.

Tabelas, índices e bancos de dados inteiros podem ser atribuídos a espaços de tabelas específicos. Para fazer isto, um usuário com o privilégio CREATE em um determinado espaço de tabelas deve passar o nome do espaço de tabelas como parâmetro para o comando relevante. Por exemplo, o comando a seguir cria uma tabela no espaço de tabelas space1:

CREATE TABLE foo(i int) TABLESPACE space1;

Como alternativa, pode-se usar o parâmetro default_tablespace:

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

Quando default_tablespace é definido como qualquer coisa, menos uma cadeia de caracteres vazia, ele fornece uma cláusula TABLESPACE implícita para os comandos CREATE TABLE e CREATE INDEX que não possuem uma cláusula explícita.

Há também o parâmetro temp_tablespaces, que determina o posicionamento de tabelas e índices temporários, bem como arquivos temporários usados ​​para fins de classificação de grandes conjuntos de dados. Pode ser uma lista de nomes de espaços de tabelas, em vez de apenas um, para que a carga associada a objetos temporários possa ser distribuída por vários espaços de tabelas. Um membro aleatório da lista é selecionado cada vez que um objeto temporário é criado.

O espaço de tabelas associado a um banco de dados é usado para armazenar os catálogos do sistema desse banco de dados. Além disso, é o espaço de tabelas padrão usado para tabelas, índices e arquivos temporários criados no banco de dados, se nenhuma cláusula TABLESPACE for fornecida, e nenhuma outra indicação for especificada por default_tablespace ou temp_tablespaces (conforme apropriado). Se um banco de dados for criado sem especificar um espaço de tabelas para ele, ele usará o mesmo espaço de tabelas do banco de dados modelo do qual está sendo copiado.

São criados automaticamente dois espaços de tabelas quando a instância é inicializada. O espaço de tabelas pg_global é usado apenas para catálogos do sistema compartilhados. O espaço de tabelas pg_default é o espaço de tabelas padrão dos bancos de dados template1 e template0 (e, portanto, também o espaço de tabelas padrão para os demais bancos de dados, a menos que seja alterado por uma cláusula TABLESPACE no comando CREATE DATABASE).

Uma vez criado, o espaço de tabelas pode ser usado a partir de qualquer banco de dados, desde que o usuário solicitante tenha privilégio suficiente. Isto significa que o espaço de tabelas não poderá ser removido até que todos os objetos de todos os bancos de dados que usam o espaço de tabelas tenham sido removidos.

Para remover um espaço de tabelas vazio, é usado o comando DROP TABLESPACE.

Para determinar o conjunto de espaços de tabelas existente, deve-se consultar o catálogo do sistema pg_tablespace. Por exemplo:

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

É possível identificar quais bancos de dados utilizam quais espaços de tabelas; veja Tabela 9.76. O metacomando \db do utilitário psql também serve para listar os espaços de tabelas existentes.

O diretório $PGDATA/pg_tblspc contém ligações simbólicas que apontam para cada um dos espaços de tabelas não originais definidos na instância. Embora não seja recomendado, é possível ajustar manualmente a disposição dos espaços de tabelas redefinindo estas ligações simbólicas. Sob nenhuma circunstância esta operação deverá ser executada enquanto o servidor estiver ativo.

Exemplo 22.1. Exemplo do tradutor

Criação de espaço de tabelas

Neste exemplo é criado o espaço de tabelas ana_tblspc para a usuária ana no servidor PostgreSQL 18 sob o sistema operacional Debian 12.

$ sudo su - postgres
$ mkdir /var/lib/postgresql/ana_tblspc   # (1)
$ psql
psql (18.4 (Debian 18.4-1.pgdg12+1))
Digite "help" para obter ajuda.
postgres=# CREATE TABLESPACE ana_tblspc
OWNER ana
LOCATION '/var/lib/postgresql/ana_tblspc';
CREATE TABLESPACE
postgres=# exit
$ ls -l  /var/lib/postgresql/18/main/pg_tblspc
total 0
lrwxrwxrwx 1 postgres postgres 30 jul 21 14:56 108947 ↵
             -> /var/lib/postgresql/ana_tblspc
$ ls -l /var/lib/postgresql/ana_tblspc
total 4
drwx------ 2 postgres postgres 4096 jul 21 14:56 PG_18_202506291
$ exit
sair
$ sudo su - ana
$ psql
psql (18.4 (Debian 18.4-1.pgdg12+1))
Digite "help" para obter ajuda.

ana=> CREATE TABLE produtos (
    num_produto integer PRIMARY KEY,
    nome text,
    preco numeric
) TABLESPACE ana_tblspc;
CREATE TABLE
ana=> \db ana_tblspc
            Lista dos espaços de tabelas
    Nome    | Dono |          Localização
------------+------+--------------------------------
 ana_tblspc | ana  | /var/lib/postgresql/ana_tblspc
(1 linha)
ana=> SELECT schemaname, tablename, tablespace
FROM pg_tables
WHERE tablename = 'produtos';
 schemaname | tablename | tablespace
------------+-----------+------------
 public     | produtos  | ana_tblspc
(1 linha)
ana=> exit
$ exit
sair

(1)

Não é possivel criar mais de um espaço de tabelas no mesmo diretório.