Estamos executando um PostgreSQL 9.1.20 com um banco de dados de cerca de 50 GB.
- Todas as coisas funcionam bem.
- Depois de alguns dias, valores inesperados estranhos aparecem em colunas numéricas, como valores negativos ou maiores em lugares inesperados.
- A parte estranha: se executarmos um
pg_dump
do mesmo banco de dados "corrompido" e depois restaurá-lo (no mesmo servidor), os dados ficarão ok. Agora as mesmas consultas retornam valores diferentes!
Por que o dump do banco de dados tem valores diferentes quando estamos tirando o dump exatamente do banco de dados "corrompido"? (O dump corrigiu os valores de nossa percepção!)
Isso pode estar relacionado a algum tipo de transação quebrada ou problema no disco rígido? Observe que reiniciar o banco de dados não resolve o problema.
Qual pode ser a causa por trás desse problema?
Conforme solicitado nos comentários alguns exemplos de dados:
#psql
\c base
select * from salXXXX where sal_id=2323;
sal_id | sal_XXXX | XXXXXX | XXXXXX | XXXXX | XXXXX | XXXXX
--------+-----------+---------------+--------------------+------------+-----------------------+------------
2323 | -30.43 | 42586501 | 6 | 13 | f |
\quit
pg_dump -h 127.0.0.1 -p 5432 --user=postgres >backup.sql
psql
drop database base;
create database base;
\c base
\i backup.sql
(no errors found here)
select * from salXXXX where sal_id=2323;
sal_id | sal_XXXX | XXXXXX | XXXXXX | XXXXX | XXXXX | XXXXX
--------+-----------+---------------+--------------------+------------+-----------------------+------------
2323 | 245.43 | 42586501 | 6 | 13 | f |
É difícil imitá-lo, raramente ocorre, mas quando ocorre é só fazer um dump, é uma solução ridícula, mas funciona.
Este é apenas um exemplo, muitos outros valores errados começam a aparecer, mesmo que reprocessemos os dados. Mas se o banco de dados for descarregado e restaurado, os valores estarão no intervalo esperado novamente.
Pode ser corrupção de índice - supondo que você tenha um índice em
sal_id
.Nesse caso,
REINDEX TABLE salXXXX;
(ou apenasREINDEX INDEX index_name
faria o mesmo truque do ciclo de despejo/restauração, que também recria todos os índices do zero.O manual aconselha:
Geralmente, considere atualizar para uma versão atual do Postgres. A versão 9.1 acabou de atingir seu EOL em setembro de 2016. Houve muitas atualizações relacionadas desde então, pode muito bem corrigir o problema para sempre.