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.
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:
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.
Qual é uma maneira melhor de encontrar e corrigir esses duplicados?
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.