Erro ao importar backup: "não foi possível criar índice exclusivo"

Olá,

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.

1 curtida

Você já tentou usar a GUI de Administração?

1 curtida

Não, eu assumi que importar via GUI invocaria o mesmo processo de importação? Vou tentar isso agora.

1 curtida

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.

Acabei de tentar importar via GUI, com exatamente o mesmo resultado:

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.

Ok, eu corrigi. Fiz o seguinte:

Entrar no container

./launcher enter app

Conectar ao banco de dados

su postgres -c 'psql discourse'

Tentar encontrar duplicatas

discourse=# select * from incoming_referers where path LIKE '%/search/' ORDER BY incoming_domain_id;

id | path | incoming_domain_id
------±-----------±-------------------
3339 | /search/ | 33
6257 | /search/ | 91
1567 | /search/ | 298
1777 | /search/ | 341
3010 | /search/ | 418
6247 | /search/ | 418
4293 | /search/ | 644
2899 | /search/ | 653
3447 | /search/ | 793
3696 | /search/ | 852
4395 | /a/search/ | 1050
6968 | /search/ | 1305
5634 | /search/ | 1387
5834 | /search/ | 1437
6519 | /search/ | 1637
7127 | /search/ | 1787
7280 | /search/ | 1827
(17 linhas)


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.
3 curtidas

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