Estou usando o PostgreSQL 8.4.15. Ao executar pg_dump
o backup de um banco de dados, recebi o seguinte erro:
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)
Ao procurar por essa mensagem de erro, encontrei algumas referências ( aqui e aqui ) que sugeriam reindexar a tabela. (Nessas discussões, havia uma referência a consultar a pg_class
tabela para encontrar o pg_toast_XXXXXX
valor correto, mas parecia que era porque não era exibido nas mensagens de erro. Pulei esta parte porque tinha um valor exibido na mensagem de erro . Acho que pode ser uma conveniência devido a uma versão posterior do PostgreSQL.)
Eu corri o seguinte:
REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;
Agora consigo usar pg_dump
sem erros.
O que é pg_toast
e o que esses comandos realmente fazem? Trata-se apenas de uma limpeza simples ou eles poderiam ter se livrado de algumas linhas nessa tabela? O que poderia ter causado o problema em primeiro lugar?
Existem cerca de 300.000 linhas nesta tabela, mas eu esperaria que houvesse apenas cerca de 250 novas linhas desde o backup anterior bem-sucedido (esta tabela é usada apenas para INSERT/SELECT, sem UPDATEs).
Dado que o que você fez foi uma reindexação, o que provavelmente aconteceu foi que ele usou uma varredura de índice para tentar localizar os valores queimados na tabela e não conseguiu encontrar nenhum. Isso soa como um índice corrompido. A análise a vácuo altera a tabela, mas a reindexação não, e as alterações são muito pequenas.
A maneira de pensar sobre isso é que os atributos TOASTed são, na verdade, divididos em blocos de cerca de 4k de tamanho e armazenados em linhas. Eles são pesquisados e classificados/reconectados com a linha principal no momento da consulta. Parece que um índice usado aqui foi corrompido e, portanto, a reindexação resolveu o problema.
Descobri que índices corrompidos geralmente são um sinal de que algo não está bem com o servidor. É bom verificar e certificar-se de que a memória, a CPU e os discos rígidos estão todos felizes e sem relatar problemas. Eu descobri que os servidores superaquecidos são particularmente propensos à corrupção de índices e, se os índices podem ser corrompidos, é preciso se preocupar com a corrupção dos dados também.