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.
./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.
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 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