Problema de upgrade com nome de usuário duplicado no DB

Então, tentei atualizar meu servidor esta manhã e obtive um erro:

PG::UniqueViolation: ERRO: valor de chave duplicado viola a restrição de unicidade “index_users_on_username”

Ele menciona um usuário “MikeC”. Então, fiz algumas investigações e foi recomendado que eu restaurasse o postgres_data e reiniciasse meu servidor, e em seguida verificasse o banco de dados em busca de duplicatas. Então, executei uma consulta rápida para username_lower = ‘mikec’ e encontrei 1 linha. Depois, encontrei esta consulta avançada:

SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;

Que retornou nenhuma linha. Então, onde está a duplicata? Qualquer ajuda é bem-vinda. Estou rodando com os dados antigos, mas gostaria de poder reconstruir o aplicativo corretamente.

1 curtida

Bem, foi assim que eu resolvi, mas tenho certeza de que existe uma maneira melhor:

Fui à minha seção de administração e pesquisei por ‘MikeC’, o que retornou 2 usuários. Então, renomeei o mais antigo e, em vez de executar o rebuild novamente, simplesmente fiz login no banco de dados e reindexei:

cd /var/discourse
./launcher enter app
sudo -i postgres psql discourse
discourse# REINDEX SCHEMA CONCURRENTLY public;

Isso indicaria outro duplicado, e eu voltaria à interface web, pesquisaria esse usuário e renomearia o usuário mais antigo. Lavar, enxaguar, repetir até que nenhum duplicado seja encontrado. Em seguida, execute o rebuild e sucesso!

No entanto, gostaria de saber:

  1. Por que o Discourse permite duplicados? O nome de usuário pode ser insensível a maiúsculas e minúsculas, mas o username_lower normaliza para o que deveria ser um valor único. Isso parece ser um bug bastante grave.

  2. Qual é uma maneira melhor de encontrar e corrigir esses duplicados?

2 curtidas

Não acho que exista uma maneira melhor. Nomes de usuário duplicados não são permitidos, mas parece que algum bug anterior não aplicava a verificação de minúsculas. Houve outro tópico sobre isso recentemente.

2 curtidas

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