Capítulo 50. Armazenamento físico dos bancos de dados

Sumário
50.1. Organização dos arquivos de banco de dados
50.2. TOAST
50.3. Disposição das páginas de banco de dados

Este capítulo fornece uma visão geral do formato de armazenamento físico utilizado nos bancos de dados do PostgreSQL.

50.1. Organização dos arquivos de banco de dados

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.

SourceForge.net Logo CSS válido!