Falha na restauração: não foi possível criar índice único

Olá,

Estou tentando restaurar um backup em uma nova instância do Discourse, pois estou realizando uma migração de servidor. Infelizmente, recebo este erro:

Li sobre isso:

Restore fails - could not create unique index - #2 by simon e excluí os índices.

Agora, quando executo:

[2] pry(main)> IncomingReferer.where(path: "/m/search")
=> []

Não obtenho nenhum resultado.

Está tudo certo agora para fazer um backup e restaurá-lo no outro servidor?

Obrigado,

Sam

Infelizmente, isso não ajudou, e eu ainda recebo essa mensagem ao restaurar:

[2021-07-03 16:53:41] ERROR:  não foi possível criar o índice único "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 16:53:41] DETAIL:  A chave (path, incoming_domain_id)=(/search, 4502) está duplicada.
[2021-07-03 16:53:41] EXCEPTION: psql falhou: DETAIL:  A chave (path, incoming_domain_id)=(/search, 4502) está duplicada.

Não está claro para mim como corrigir isso.

Encontrei mais algumas duplicatas com IncomingReferer.where("path LIKE '%/m/search%'"), então também usei o destroy nesses registros. Minha instância agora parece não estar funcionando de forma alguma – até mesmo no servidor antigo, então vou tentar recriá-la.

Sam

Algo ainda está errado. Estou recebendo:

[2021-07-03 17:28:53] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 17:28:53] DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.
[2021-07-03 17:28:53] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.

ao tentar restaurar um novo backup.
Mas meu console mostra que eu limpei as instâncias no servidor em execução (que está de volta no ar após a reconstrução):

[1] pry(main)> IncomingReferer.where(path: "/m/search")
=> []
[2] pry(main)> IncomingReferer.where("path LIKE '%/m/search%'")
=> []

Alguém pode orientar o que precisa ser feito para corrigir o banco de dados para que eu possa restaurá-lo em outra máquina?

Obrigado,

Sam

Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes) pode oferecer algumas pistas.

Obrigado.

Li isso, mas não sei quais comandos ou consultas executar para resolver meu problema.

Sam

Basicamente, você deve tentar recriar o índice e continuar excluindo itens até conseguir reindexá-lo. Parece que você está fazendo o correto; só precisa continuar assim para todas as entradas duplicadas.

Se tiver um orçamento, pode postar no Marketplace.

Oi Jay,

Não é legal no Reino Unido expor nosso banco de dados a terceiros para corrigir esses problemas, e mesmo que fosse, não tenho interesse em fazê-lo, pois quero proteger a privacidade dos usuários.

Como mantenedor de software de código aberto, a ideia de levar isso ao Marketplace é decepcionante, especialmente quando parece haver um reconhecimento tácito de que os problemas foram introduzidos por uma atualização do Postgres que o Discourse incluiu em seu container Docker. Usamos o Discourse no container Docker porque entendemos as dependências fortemente acopladas e preferimos delegar o gerenciamento de versões e dependências à expertise da equipe do Discourse.

Parece ser aceito que se trata de uma regressão no Postgres 12 e existem algumas mitigações possíveis. No entanto, os primeiros relatos surgiram há mais de um ano, e tenho certeza de que haverá mais usuários afetados no futuro caso tentem restaurar um backup.

Preferiria patrocinar algum tempo de desenvolvimento para corrigir isso no Discourse upstream, para que outros também possam se beneficiar. Enquanto isso, nosso fórum não está funcional e precisarei consultar alguém com conhecimento de DBA em Postgres.

Abraços,

Sam

1 curtida

Oi, Sam.

Desculpe não ter conseguido te dar instruções suficientes para resolver seu problema sozinho, mas foi assim que você fez parecer. Achei que pudesse ser um alívio, e não uma decepção, saber que existem outras formas de colocar seu fórum online novamente.

Abraços

1 curtida

Oi, Jay

De jeito nenhum. Você não me deve nada — mas eu esperava que você tivesse uma solução rápida, dada sua história de postagens, e assumi que eu tivesse perdido algo óbvio, já que suas postagens pareciam ser uma resposta definitiva e o tópico estava fechado.

Vou te avisar como as coisas evoluem.

Abraços,

Sam

1 curtida

Infelizmente, isso ainda é um problema para nós, e não podemos migrar os servidores, o que é bastante preocupante.

Estaremos dispostos a pagar alguém para resolver isso, mas, após esse problema e o reconhecimento dele diversas vezes sem uma solução clara no fórum, estamos seriamente considerando migrar para um software de fórum diferente, como o Flarum. Pode não ser tão rico em recursos quanto o Discourse, mas é LAMP e eu (como alguém que não é desenvolvedor web) consigo entendê-lo.

Quando usamos o container Docker do Discourse, esperávamos que houvesse suporte. Se tivéssemos implantado tudo separadamente e usado nossa própria versão do Postgres, eu poderia entender a resposta. Mas até hoje, tudo o que fizemos foi usar o ambiente que vocês recomendaram e forneceram, e agora estamos bastante prejudicados em termos de migração para um novo servidor (temos um prazo iminente).

Neste momento, minha melhor aposta é um backup e restauração de volume Docker, porque os backups do Discourse não são utilizáveis. Isso também é preocupante: temos backups sendo feitos diariamente, mas não conseguimos restaurá-los em um novo ambiente do Discourse. Pergunto-me quantos outros encontrarão um problema assim em breve.

Sam

Houve de fato vários bugs no Postgres que causariam a corrupção de índices. Achamos que a maioria deles foi resolvida no Postgres 13.x.