Depois de ser mordido pelo bug mencionado nas notas de lançamento do 9.3.4, percebi que uma parte muito pequena dos meus dados está corrompida, após fazer um failover. O bug se mostrou como linhas duplicadas, com a mesma chave primária. Agora posso facilmente excluir alguns dados do meu banco de dados, se isso for necessário para corrigir meu problema, então acabei de excluir todas as duplicatas. Depois de fazer isso, decidi escrever um script que elimina/recria todas as restrições (Pkeys e Fkeys), a fim de validar que nenhum dos meus dados esteja corrompido. Isso funcionou bem, até que esbarrei no seguinte erro, ao criar uma das chaves estrangeiras:
ERROR: failed to find parent tuple for heap-only tuple at (1192248,5) in table "fruits"
CONTEXT: SQL statement "ALTER TABLE "pm"."fruits" ADD CONSTRAINT "fruits_pkey" PRIMARY KEY (id)"
O que é, e como resolvo?
Esta mensagem de erro é nova no postgres e está de fato relacionada ao bug de replicação corrigido em 9.3.3
Conforme mencionado no git commit de segunda-feira, 17 de março de 2014:
Como
parent tuple
é uma noção interna do postgres, a implicação seria que a estrutura de dados para esta relação está em um estado corrompido, além da solução de problemas no nível SQL.A maneira mais segura de sair dessa bagunça seria, se possível, para
pg_dump
os bancos de dados afetados, soltá-los e recarregá-los e, em seguida, recriar as restrições nesse estado limpo.