18.6. Espaços de tabelas

No PostgreSQL os espaços de tabelas permitem aos administradores definir locais no sistema de arquivos onde os arquivos que representam objetos do banco de dados podem ser armazenados. Uma vez criado, o espaço de tabelas pode ser referenciado por seu nome ao criar os objetos do banco de dados. [1] [2] [3]

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

Primeira: se a partição ou volume onde o agrupamento foi inicializado ficar sem espaço, e não puder ser estendido, pode ser criado um espaço de tabelas em uma partição diferente e utilizado até que o sistema possa ser reconfigurado.

Segunda: os espaços de tabelas permitem que o administrador utilize seu conhecimento do padrão de utilização dos objetos de banco de dados para otimizar o desempenho. Por exemplo, um índice muito utilizado pode ser colocado em um disco muito rápido com alta disponibilidade, como uma unidade de estado sólido. [4] Ao mesmo tempo, uma tabela armazenando dados históricos raramente utilizados, ou que seu desempenho não seja crítico, pode ser armazenada em um sistema de disco mais barato e mais lento.

Para definir um espaço de tabelas é utilizado o comando CREATE TABLESPACE como, por exemplo:

CREATE TABLESPACE area_veloz LOCATION '/mnt/sda1/postgresql/data';

O local deve ser um diretório existente, vazio, pertencente ao usuário de sistema do PostgreSQL. Depois disso, todos os objetos criados neste espaço de tabelas serão armazenados em arquivos sob este diretório.

Nota: Geralmente não faz muito sentido criar mais de um espaço de tabelas por sistema de arquivos lógico, uma vez que não se pode controlar o local de cada arquivo dentro do sistema de arquivos lógico. Entretanto, o PostgreSQL não impõe este tipo de restrição e, na verdade, não está preocupado com as fronteiras do sistema de arquivos. Apenas armazena os arquivos nos diretórios onde se informa que devam ser utilizados.

A criação do espaço de tabelas deve ser feito por um superusuário do banco de dados, mas após ser criado pode ser permitido o seu uso pelos usuários comuns. Para isso ser feito deve ser concedido o privilégio CREATE para o mesmo.

Podem ser direcionados tabelas, índices, e bancos de dados inteiros para um determinado espaço de tabelas. Para que isto seja feito, um usuário que possua o privilégio CREATE para o espaço de tabelas deve informar o nome do espaço de tabelas no respectivo comando. Por exemplo, o comando abaixo cria uma tabela no espaço de tabelas espaco1:

CREATE TABLE foo(i int) TABLESPACE espaco1;

Como alternativa, pode ser utilizado o parâmetro default_tablespace:

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

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

O espaço de tabelas associado com o banco de dados é utilizado para armazenar os catálogos do sistema deste banco de dados, assim como todos os arquivos temporários criados pelos processos servidor que utilizam este banco de dados. Além disso, é o espaço de tabelas padrão usado para as tabelas e índices criados no banco de dados, se a cláusula TABLESPACE não for fornecida (explicitamente ou através de default_tablespace) quando os objetos são criados. Se o banco de dados for criado sem que seja especificado um espaço de tabelas para o mesmo, é utilizado o mesmo espaço de tabelas do banco de dados modelo do qual é copiado.

São criados, automaticamente, dois espaços de tabelas pelo utilitário initdb. O espaço de tabelas pg_global é utilizado para os 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, será o espaço de tabelas padrão para todos os outros bancos de dados, a menos que seja mudado pela cláusula TABLESPACE do comando CREATE DATABASE).

Uma vez criado, o espaço de tabelas pode ser utilizado por qualquer banco de dados, desde que o usuário solicitante tenha os privilégios necessários. Isto significa que o espaço de tabelas não pode ser removido até que todos os objetos de todos os bancos de dados que utilizam o espaço de tabelas sejam removidos.

Para remover um espaço de tabelas vazio deve ser utilizado o comando DROP TABLESPACE.

Para conhecer o conjunto de espaços de tabelas existente deve ser consultado o catálogo do sistema pg_tablespace como, por exemplo:

SELECT spcname FROM pg_tablespace;

O meta-comando \db do programa psql também pode ser utilizado para listar os espaços de tabela existentes.

O PostgreSQL faz amplo uso de vínculos simbólicos para simplificar a implementação de espaços de tabelas. Isto siginifica que os espaços de tabelas somente podem ser utilizados nos sistemas que suportam vínculos simbólicos. [5]

O diretório $PGDATA/pg_tblspc contém vínculos simbólicos que apontam para cada um dos espaços de tabela não-nativos definidos no agrupamento. Embora não seja recomendado, é possível mudar a disposição manualmente. Duas advertências: não faça isso com o postmaster executando; após reiniciar o postmaster, deve ser atualizado o catálogo do sistema pg_tablespace para que reflita os novos locais (Se isto não for feito, o pg_dump continuará mostrando os locais antigos dos espaços de tabelas).

Exemplo 18-2. Criação de espaço de tabelas no Windows

Este exemplo mostra o efeito produzido no diretório $PGDATA/pg_tblspc pela criação de um espaço de tabelas. [6] [7]

=# CREATE TABLESPACE disco_f LOCATION 'F:\\postgresql';

CREATE TABLESPACE

=# SELECT * FROM pg_tablespace;

  spcname   | spcowner |  spclocation  | spcacl
------------+----------+---------------+--------
 pg_default |        1 |               |
 pg_global  |        1 |               |
 disco_f    |        1 | F:/postgresql |
(3 linhas)

E:\Program Files\PostgreSQL\8.0\data> dir pg_tblspc

 Volume in drive E is Local Disk
 Volume Serial Number is 1C2A-9875

 Directory of E:\Program Files\PostgreSQL\8.0\data\pg_tblspc

21/06/2005  11:16       <DIR>          .
21/06/2005  11:16       <DIR>          ..
21/06/2005  11:16       <JUNCTION>     58588
               0 File(s)              0 bytes
               3 Dir(s)   3.744.190.464 bytes free

Notas

[1]

Oracle — Os dados são armazenados logicamente em espaços de tabelas, e fisicamente em arquivos de dados associados aos espaços de tabelas correspondentes. Os bancos de dados, espaços de tabelas e arquivos de dados são proximamente relacionados, mas possuem diferenças importantes: Um banco de dados do Oracle é formado por uma ou mais unidades lógicas de armazenamento, chamadas de espaços de tabelas, que coletivamente armazenam todos os dados do banco de dados; cada espaço de tabelas do Oracle é formado por um ou mais arquivos chamados de arquivos de dados, que são estruturas físicas em conformidade com o sistema operacional onde o Oracle está executando; Os dados do banco de dados são coletivamente armazenados nos arquivos de dados que formam cada espaço de tabelas do banco de dados. — Por exemplo, o banco de dados Oracle mais simples poderia ter um espaço de tabelas e um arquivo de dados. Outro banco de dados poderia ter três espaços de tabelas, cada um formado por dois arquivos de dados (num total de seis arquivois de dados). Oracle® Database Concepts 10g Release 1 (10.1) Part Number B10743-01 (N. do T.)

[2]

SQL Server — O espaço de tabelas (no Oracle) é uma unidade de armazenamento do banco de dados aproximadamente equivalente a um grupo de arquivos no Microsoft SQL Server. Os espaços de tabelas permitem o armazenamento e gerenciamento dos objetos do banco de dados dentro de grupos individuais. SQL Server 2005 Books Online — Managing Oracle Tablespaces (N. do T.)

[3]

DB2 — O espaço de tabelas é uma estrutura de armazenamento que contém tabelas, índices, objetos grandes e dados longos. Os espaços de tabelas residem em grupos de partição do banco de dados. Os espaços de tabelas permitem atribuir a posição do banco de dados e dos dados da tabela diretamente a recipientes (containers); O recipiente pode ser um nome de diretório, um nome de unidade, ou um nome de arquivo. Os espaços de tabelas podem proporcionar um desempenho melhor e uma configuração mais flexível. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.)

[4]

unidade de estado sólido — um tipo de unidade de hardware que não contém partes móveis, geralmente esta unidade é feita em grande parte de circuitos eletrônicos. Solid-state device. (N. do T.)

[5]

O vínculo simbólico aponta para um arquivo por nome. Quando o kernel encontra um vínculo simbólico ao procurar por um nome de caminho, redireciona sua atenção para o nome de caminho armazenado como conteúdo do vínculo. Linux Administration Handbook — Evi Nemeth e outros — Prentice Hall PTR. (N. do T.)

[6]

Exemplo escrito pelo tradutor, não fazendo parte do manual original.

[7]

junction point — o ponto de junção é uma posição física no disco rígido que aponta para dados localizados em outro local no disco rígido ou em outra unidade de armazenamento. Os pontos de junção são criados quando é criada uma unidade montada. Os pontos e junção também podem ser criados pelo comando linkd. Microsoft Glossary for Business Users (N. do T.)

SourceForge.net Logo CSS válido!