Este capítulo fornece uma visão geral do formato de armazenamento físico utilizado nos bancos de dados do PostgreSQL.
Esta seção descreve o formato de armazenamento no nível de arquivos e diretórios.
Todos os dados necessários para um agrupamento de bancos de dados são armazenados dentro do diretório de dados do agrupamento, geralmente referenciado como PGDATA (devido ao nome da variável de ambiente que pode ser utilizada para defini-lo). Um local comum para PGDATA é /var/lib/pgsql/data. Podem existir na mesma máquina vários agrupamentos, gerenciados por diferentes postmaster.
O diretório PGDATA contém vários subdiretórios e arquivos de controle, conforme mostrado na Tabela 50-1. Além destes itens requeridos, os arquivos de configuração do agrupamento postgresql.conf, pg_hba.conf e pg_ident.conf são tradicionalmente armazenados em PGDATA (embora a partir da versão 8.0 do PostgreSQL seja possível mantê-los em qualquer outro lugar).
Tabela 50-1. Conteúdo de PGDATA
Item | Descrição |
---|---|
PG_VERSION | Arquivo contendo o número de versão principal do PostgreSQL |
base | Subdiretório contendo subdiretórios por banco de dados |
global | Subdiretório contendo tabelas para todo o agrupamento, como pg_database |
pg_clog | Subdiretório contendo dados sobre status de efetivação de transação |
pg_subtrans | Subdiretório contendo dados sobre status de subtransação |
pg_tblspc | Subdiretório contendo vínculos simbólicos para espaços de tabelas |
pg_xlog | Subdiretório contendo os arquivos do WAL (registro prévio da escrita) |
postmaster.opts | Arquivo contendo as opções de linha de comando com as quais o postmaster foi inicializado da última vez |
postmaster.pid | Arquivo de bloqueio contendo o PID corrente do postmaster, e o ID do segmento de memória compartilhada (não mais presente após o postmaster ser parado) |
Para cada banco de dados do agrupamento existe um subdiretório dentro de PGDATA/base, com nome correspondente ao OID do banco de dados em pg_database. Este subdiretório é o local padrão para os arquivos do banco de dados; em particular, os catálogos do sistema do banco de dados são armazenados neste subdiretório.
Cada tabela e índice é armazenado em um arquivo separado, com nome correspondente ao número do filenode da tabela ou do índice, que pode ser encontrado em pg_class.relfilenode.
Cuidado |
Deve ser observado que enquanto o filenode da tabela geralmente corresponde ao seu OID, não é necessariamente assim; algumas operações, como TRUNCATE, REINDEX, CLUSTER, e algumas formas de ALTER TABLE, podem mudar o filenode e preservar o OID. Deve-se evitar assumir que o filenode e o OID da tabela sejam idênticos. |
Quando uma tabela ou um índice excede 1Gb, este é dividido em segmentos de até 1 GB. O nome do primeiro arquivo de segmento é o mesmo do filenode; os arquivos subseqüentes são chamados de filenode.1, filenode.2, etc. Esta organização evita problemas em plataformas que possuem limitação de tamanho de arquivo. O conteúdo das tabelas e dos índices são discutidos em mais detalhes na Seção 50.3.
As tabelas que possuem colunas com entradas potencialmente grandes possuem uma tabela TOAST (fatias) associada, que é utilizada para armazenamento fora-de-linha dos valores de campo que são muito grandes para serem mantidos na própria linha da tabela. pg_class.reltoastrelid faz o vínculo entre a tabela e a sua tabela TOAST, caso haja alguma. Para obter informações adicionais deve ser consultada a Seção 50.2.
Os espaços de tabela tornam o cenário mais complicado. Cada espaço de tabelas definido pelo usuário possui um vínculo simbólico dentro do diretório PGDATA/pg_tblspc, que aponta para o diretório físico do espaço de tabelas (conforme especificado em seu comando CREATE TABLESPACE). O nome do vínculo simbólico corresponde ao OID do espaço de tabelas. Dentro do diretório físico do espaço de tabelas existe um subdiretório, para cada banco de dados que possui elementos no espaço de tabelas, com nome correspondente ao OID do banco de dados. As tabelas dentro deste diretório seguem o esquema de nomes baseado no filenode. O espaço de tabelas pg_default não é acessado através de pg_tblspc, e corresponde a PGDATA/base. De maneira semelhante, o espaço de tabelas pg_global não é acessado através de pg_tblspc, e corresponde a PGDATA/global.