Estou tentando migrar um fórum para um novo servidor. Ambos os servidores estão executando a versão mais recente do discourse docker. Ao importar o backup via linha de comando, recebo o seguinte erro:
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
EXCEPTION: psql failed: DETAIL: Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
Isso parece ser o mesmo erro ou um erro semelhante a:
No entanto, no meu caso, os registros duplicados estão no caminho /search/ em vez de /m/search, como é o caso no tópico vinculado acima.
Conectei-me ao contêiner no servidor antigo (./launcher enter app) e no console Rails (rails c) tentei procurar os registros duplicados usando:
IncomingReferer.where(path: "/search")
e IncomingReferer.where("path LIKE '%/search%'")
No entanto, isso resulta em centenas de registros sendo exibidos. Como posso descobrir quais registros estão duplicados e como posso excluí-los com segurança e reconstruir? O fórum está funcionando bem no servidor antigo, só precisamos mudar para um novo hardware.
Eu suspeito que isso signifique que você tenha um índice corrompido. Que versão do Postgres você está executando?
Algo como:
cd /var/discourse
cat shared/standalone/postgres_data/PG*
(Não me lembro exatamente do nome do arquivo do Postgres).
Você pode pesquisar aqui por “postgres corrupt index” e encontrar um tópico que escrevi uma vez sobre como localizar esses registros ruins e excluí-los.
Basicamente, você tenta recriar esse índice, exclui os registros sobre os quais ele reclama e, em seguida, tenta recriar o índice novamente até que ele seja recriado com sucesso.
O servidor antigo não possui um arquivo chamado PG_VERSION. Como posso descobrir qual versão está em execução? Atualizei a instalação do Docker para a versão mais recente hoje.
O novo servidor (recém-inicializado) está executando o PostgreSQL V13
cat shared/standalone/postgres_data/PG_VERSION
13
Existe um procedimento recomendado para fazer isso?
Eu tinha um tópico com algumas dicas, mas não o vejo mais. Faz quase um ano desde a atualização do PostgreSQL 12.
reindex index index_incoming_referers_on_path_and_incoming_domain_id;
E
ActiveRecord::Base.connection.execute('reindex index index_incoming_referers_on_path_and_incoming_domain_id;')
São maneiras de tentar reconstruir o índice. Isso gerará um erro e, em seguida, você poderá excluir os registros problemáticos. Você precisará incluir tanto o caminho quanto o ID.
Excluir duplicata
`DELETE FROM incoming_referers WHERE path LIKE '%/search/' AND id IN (6247);`
Em seguida, reconstruir
discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING: cannot reindex invalid index “public.incoming_referers_pkey_ccnew” concurrently, skipping
WARNING: cannot reindex invalid index “public.index_incoming_referers_on_path_and_incoming_domain_id_ccnew” concurrently, skipping
WARNING: cannot reindex invalid index “pg_toast.pg_toast_20732_index_ccnew” concurrently, skipping
REINDEX
Depois, fiz outro backup, copiei para o novo servidor e a importação foi bem-sucedida :smiley:
Seria bom se o processo de backup pudesse identificar duplicatas para evitar problemas. Tive a sorte de ter acesso ao servidor original, que ainda estava em execução. Se estivesse restaurando um backup frio, isso provavelmente seria um problema maior.
Muito obrigado pela sua ajuda.