CREATE INDEX
ERRO: não foi possível criar o índice único "index_incoming_referers_on_path_and_incoming_domain_id"
DETALHE: A chave (path, incoming_domain_id)=(/m/search, 25) está duplicada.
EXCEÇÃO: psql falhou: DETALHE: A chave (path, incoming_domain_id)=(/m/search, 25) está duplicada.
Esse problema com a tabela incoming_referers tem surgido algumas vezes recentemente. Não tenho certeza do motivo pelo qual essa tabela específica está causando problemas, mas parece provável que os problemas estejam relacionados. Talvez alguém mais da equipe do Discourse tenha ideias sobre o que pode estar causando a criação de registros duplicados.
Você ainda tem acesso ao site no qual criou o arquivo de backup? Se sim, a correção é excluir o registro duplicado do banco de dados e, em seguida, criar um novo arquivo de backup. Para fazer isso, você deve acessar via SSH o servidor antigo e cd para o diretório /var/discourse:
cd /var/discourse
Em seguida, execute
./launcher enter app
Depois, entre no console do Rails com
rails c
Você deverá ver um prompt semelhante a este:
[1] pry(main)>
Tente executar o seguinte comando no console do Rails e nos informe o que ele retorna:
IncomingReferer.where(path: "/m/search")
Deve retornar um array com dois ou mais registros.
Obrigado por verificar isso! O resultado que você obteve é exatamente o mesmo que eu vi em outro site mais cedo hoje. É um problema solucionável, mas vou tentar conseguir que um de nossos engenheiros dê uma olhada no que está acontecendo.
Meu principal motivo para migrar os servidores era o fato de eu estar no Debian 8, que está prestes a perder o suporte.
Com esse problema de restauração, optei por fazer a atualização para o Debian 9 no mesmo servidor. O processo foi bem-sucedido, então, por enquanto, há um alívio.
Obrigado pelo seu apoio.
Você precisa fazer uma busca difusa para que ele não assuma que o índice funcione. Um único caractere de porcentagem provavelmente é suficiente se estiver no início, eu acho.
Você pode simplesmente excluir o registro extra. Para fazer isso corretamente, no entanto, você precisa atualizar a outra tabela que faz referência a esta. Tenho que procurar isso toda vez, pois há algumas tabelas diferentes que se relacionam com ela.
Esse problema é atribuído a extensões de terceiros, o que não faz muito sentido. Parece que deve ser culpa do PostgreSQL, mas não tenho certeza. Encontro isso algumas vezes por mês, parece (score) em vários sites).
Também estou com um problema de chave duplicada. Existe uma correção documentada?
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
Embora eu tenha atualizado meu servidor no local e, portanto, não restaurarei mais para um novo servidor, tentei isso por curiosidade e não encontrei nenhum registro com pesquisa difusa:
Que bom ouvir isso. Tenho atualizado com muito esforço a outra tabela que referencia essas linhas. É um grande incômodo, pois nunca consigo lembrar o que era, então é sempre a primeira vez, repetidamente.
Remover esses dois duplicados foi bem-sucedido, mas a reconstrução subsequente dos índices gerou novos erros. Isso é um problema grave? Como corrigimos ou deletamos aquela linha de busca 3433?
postgres=# \connect discourse
Você agora está conectado ao banco de dados "discourse" como usuário "postgres".
discourse=# REINDEX SCHEMA CONCURRENTLY public;
AVISO: não é possível reindexar o índice inválido "public.incoming_referers_pkey_ccnew" de forma concorrente, ignorando
AVISO: não é possível reindexar o índice inválido "public.index_incoming_referers_on_path_and_incoming_domain_id_ccnew" de forma concorrente, ignorando
AVISO: não é possível reindexar o índice inválido "pg_toast.pg_toast_2782645_index_ccnew" de forma concorrente, ignorando
ERRO: não foi possível criar o índice exclusivo "index_incoming_referers_on_path_and_incoming_domain_id_ccnew1"
DETALHE: A chave (path, incoming_domain_id)=(/search/, 3433) está duplicada.
CONTEXTO: worker paralelo
Tentei reconstruir manualmente esses 4 índices. Dois tiveram sucesso, dois falharam. Devo eliminar essas duas linhas duplicadas?
discourse=# REINDEX INDEX CONCURRENTLY "public"."incoming_referers_pkey_ccnew";
REINDEX
discourse=# REINDEX INDEX CONCURRENTLY "public"."index_incoming_referers_on_path_and_incoming_domain_id_ccnew";
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_cc_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1861) is duplicated.
discourse=# REINDEX INDEX CONCURRENTLY "pg_toast"."pg_toast_2782645_index_ccnew";
REINDEX
discourse=# REINDEX INDEX CONCURRENTLY "index_incoming_referers_on_path_and_incoming_domain_id_ccnew1";
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_c_ccnew1"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
@riking Corromper índices no PostgreSQL é um bug do PostgreSQL, não do Discourse. Podemos certamente melhorar o desempenho dessa inserção, mas o bug do PostgreSQL precisa ser corrigido no próprio PostgreSQL.
Minha suposição é que isso tenha a ver com algum tipo de desligamento abrupto do motor do banco de dados, talvez devido a uma queda de energia.
Essa é uma explicação razoável. O comando ./launcher shutdown app (ou rebuild) realiza um desligamento limpo do PostgreSQL de alguma forma? Ah, mas aposto que uma atualização não supervisionada não sabe como fazer um desligamento limpo dos contêineres do Docker, certo?