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:
Primeira, se a partição ou volume no qual a instância foi inicializada ficar sem espaço, e não puder ser estendida, poderá ser criado um espaço de tabelas em uma partição diferente, e usado até que o sistema possa ser reconfigurado.
Segunda, os espaços de tabelas permitem que o administrador use o conhecimento do padrão de uso dos objetos do banco de dados para otimizar o desempenho. Por exemplo, um índice muito usado pode ser colocado em um disco muito rápido e altamente disponível, como um dispositivo de estado sólido. Ao mesmo tempo, uma tabela que armazena dados arquivados que são raramente usados, ou não são críticos para o desempenho, pode ser armazenada em um sistema de disco mais barato e mais lento.
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.
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
Não é possivel criar mais de um espaço de tabelas no mesmo diretório. |