"EXCEÇÃO: psql falhou: DETALHE: Chave (post_id)=(36946) está duplicada."

Estou tentando migrar meu servidor para um novo host, então baixei um arquivo de backup e o carreguei para o novo host. Instalei uma cópia nova do Discourse e segui as instruções para fazer isso pela linha de comando:

Infelizmente, o discourse restore databasename falha com:

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "posts_search_pkey"
DETAIL:  Key (post_id)=(36946) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (post_id)=(36946) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:149:in `restore'

Parece que há algo errado com o arquivo do banco de dados? Alguém pode me dar uma direção sobre como posso corrigir esse erro? Ainda tenho acesso ao servidor original, que parece estar funcionando bem.

Existe algum comando SQL ou algo que eu possa executar que analise (e corrija?) o banco de dados antes de eu baixar um backup?

Parece que você tem um índice corrompido. Qual versão do postgres é esta?

Existem alguns tópicos sobre isso. Você pode tentar reindexar essa tabela na instância em execução e, em seguida, excluir ou corrigir os IDs duplicados.

Sim, acho que está corrompido. Adoraria se alguém pudesse me dizer como consertar :slight_smile:

O Postgres é 13.6. Estou tentando movê-lo para uma nova instância em um servidor diferente.

Tentei rake search:reindex dentro do contêiner docker, e falha com:

........rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "posts_search_pkey"
DETAIL:  Key (post_id)=(86919) already exists.

É possível apenas remover o registro ofensivo e reindexar ou algo assim?

Qualquer ajuda é bem-vinda!

Sim, eu recomendo apenas excluir a linha, a maneira mais simples de seguir em frente

2 curtidas

Alguém pode me dar alguns comandos psql que posso usar para identificar e remover as linhas problemáticas?

Obrigado, agradeço!

Eu acho que é algo como

./launcher enter app
su - postges
psql discourse
select id from post_search_data were post_id>86918 and post_id<86921;
--- quando você obtiver o id ----
delete from post_search_data where id=ID_FROM_LAST_QUERY

Pode haver mais.

Talvez alguém possa fornecer mais ajuda, mas é tudo o que acho que posso fazer sem estar logado no seu servidor. Se precisar de mais ajuda, você pode postar em Marketplace ou entrar em contato comigo diretamente.

Ou talvez seja seguro simplesmente apagar e deixar que seja regenerado, mas não tenho muita certeza sobre isso.

Obrigado pela ajuda, pessoal.

Consegui fazer o seguinte:

discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew2"
DETAIL:  Key (post_id)=(116038) is duplicated.
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 2
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 0
discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew3"
DETAIL:  Key (post_id)=(9336) is duplicated.
discourse=# delete from post_search_data
where post_id = 9336;
DELETE 1
.
.
.
.
discourse=# reindex index concurrently "posts_search_pkey";
REINDEX

Assim que tudo pareceu ok, fiz um backup completo e o restaurei em um novo servidor sem problemas.

Agradeço a todos pelo tempo. Eu amo o Discourse!

Lição aprendida: verifique os backups de vez em quando para ter certeza de que estão bons :slight_smile: Eu mantenho backups diários e também “snapshots” mensais. O backup mais antigo que eu tinha que não tinha um banco de dados corrompido tinha 4 meses :frowning:

5 curtidas

Ótimo! Fico feliz que você conseguiu!

@sam O que é perturbador é que eu pensei que a explicação era que isso era um problema com o PG<13, mas você está executando o PG13.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.