Capítulo 25. Registro prévio da escrita (WAL)

Sumário
25.1. Benefícios do WAL
25.2. Benefícios futuros
25.3. Configuração do WAL
25.4. Internamente

O registro prévio da escrita (WAL = write ahead logging) é uma abordagem padrão para registrar transações. A descrição detalhada pode ser encontrada na maioria (se não em todos) os livros sobre processamento de transação. Em poucas palavras, o conceito central do WAL é que as alterações nos arquivos de dados (onde as tabelas e os índices residem) devem ser escritas somente após estas alterações terem sido registradas, ou seja, quando os registros que descrevem as alterações tiverem sido descarregados em um meio de armazenamento permanente. Se este procedimento for seguido, não será necessário descarregar as páginas de dados no disco a cada efetivação de transação, porque se sabe que no evento de uma queda será possível recuperar o banco de dados utilizando o registro: inicialmente todas as alterações que não foram aplicadas às páginas de dados serão refeitas a partir dos registros (isto é a recuperação de rolar para a frente, roll-forward, também conhecida como REDO), e depois as alterações feitas pelas transações não efetivadas são removidas das páginas de dados (recuperação de rolar para trás, roll-backward, UNDO).

25.1. Benefícios do WAL

O primeiro grande benefício da utilização do WAL é a redução significativa do número de escritas em disco, uma vez que na hora em que a transação é efetivada somente precisa ser descarregado em disco o arquivo de registro, em vez de todos os arquivos de dados modificados pela transação. Em ambiente multiusuário, a efetivação de várias transações pode ser feita através de um único fsync() do arquivo de registro. Além disso, o arquivo de registro é escrito seqüencialmente e, portanto, o custo de sincronizar o registro é muito menor do que o custo de descarregar as páginas de dados. Isto é especialmente verdade em servidores tratando muitas transações pequenas afetando partes diferentes do armazenamento de dados.

O benefício seguinte é a consistência das páginas de dados. A verdade é que antes do WAL o PostgreSQL nunca foi capaz de garantir a consistência no caso de uma queda. Antes do WAL, qualquer queda durante a escrita poderia resultar em:

  1. linhas de índice apontando para linhas inexistentes da tabela
  2. perda de linhas de índice nas operações de quebra de página (split)
  3. conteúdo da página da tabela ou do índice totalmente corrompido, por causa das páginas de dados parcialmente escritas

Os problemas com os índices (problemas 1 e 2) possivelmente poderiam ter sido resolvidos através de chamadas adicionais à função fsync(), mas não é óbvio como tratar o último caso sem o WAL; se for necessário, o WAL salva todo o conteúdo da página de dados no registro, para garantir a consistência da página na recuperação após a queda.

SourceForge.net Logo