Hoje atualizei nosso aplicativo Discourse para a versão 3.0.1. A atualização falhou ao tentar processar a migração do postgres.
Especificamente aqui:
2023-01-27 04:50:48.628 UTC [483] discourse@discourse ERROR: duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 04:50:48.628 UTC [483] discourse@discourse DETAIL: Key (name)=(e-mail) already exists.
2023-01-27 04:50:48.628 UTC [483] discourse@discourse STATEMENT: UPDATE tags t
SET public_topic_count = x.topic_count
FROM (
SELECT
COUNT(topics.id) AS topic_count,
tags.id AS tag_id
FROM tags
INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
GROUP BY tags.id
) x
WHERE x.tag_id = t.id
AND x.topic_count <> t.public_topic_count;
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
Parece que algumas tags tinham duplicatas. Conectei-me ao postgres e corrigi as tags. A migração e a atualização foram concluídas depois.
Minha pergunta é: eu lidei corretamente mexendo no banco de dados? Eu apenas mudei o nome das tags duplicadas.
Não consigo dizer como as tags duplicadas foram criadas. Elas foram inseridas nos últimos 2 a 3 anos.
Não tenho certeza se essa situação pode ocorrer novamente.
Sim. É também por causa de tags duplicadas / index_tags_on_name.
No meu caso, a tag tem apenas um nome diferente.
Atualmente tentando descobrir:
como atualizar o ruby para 3.0.0 porque ele reclama que web-push está em 2.6.7, então eu nem consigo entrar no rails c, para fazer comandos sofisticados para corrigir tags
como excluir a tag com segurança do banco de dados postgres, mas ainda sem ideia
I, [2023-01-27T07:46:34.317438 #1] INFO -- : \u003e cd /var/www/discourse \u0026\u0026 su discourse -c 'bundle exec rake db:migrate'
2023-01-27 07:46:45.663 UTC [584] discourse@discourse ERROR: duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL: Key (name)=(hws-connect) already exists.
2023-01-27 07:46:45.663 UTC [584] discourse@discourse STATEMENT: UPDATE tags t
SET public_topic_count = x.topic_count
FROM (
SELECT
COUNT(topics.id) AS topic_count,
tags.id AS tag_id
FROM tags
INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
GROUP BY tags.id
) x
WHERE x.tag_id = t.id
AND x.topic_count <> t.public_topic_count;
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_tags_on_name"
DETAIL: Key (name)=(hws-connect) already exists.
Este erro aparece 3 vezes, porque a tag parece ser encontrada em 3 tópicos.
Eu me arrependo de ter ativado as tags se soubesse que isso aconteceria e por que não houve um aviso sobre isso no frontend.
Eu só quero excluí-las e finalmente colocar meu fórum no ar novamente
Minha pergunta é se posso renomear a tag “hws-connect” no banco de dados sem corromper a infraestrutura do discourse?
E… como posso renomeá-la via postgres?
você terá que aceitar uma falha estranha ao executar sua própria instalação de software de milhões de dólares (apoiado por uma comunidade super prestativa) que você pode usar (quase) de graça
Recentemente, atualizei dois sites que são usuários bastante intensivos de tags e não tive problemas.
Em meus mais de 5 anos executando várias instâncias do Discourse, acho que tive um problema como este uma vez?
De qualquer forma, parece um problema muito semelhante a este, talvez você possa usar uma estratégia semelhante para resolver?:
Parece que você já estava no caminho certo aqui, você só precisa seguir em frente…
Eu sei e não é nada sobre/contra o discourse ou a atualização em si. Acontece e tudo bem.
Só queria não ter que lidar com um cenário travado onde tenho que lutar contra tantos tópicos (docker, ruby, postgres, discourse). Não é meu trabalho diário e exige investimento de tempo.
Atualização: a melhor observação do seu tópico @merefield foi
Acho que deveria ser corajoso
Mexer em um banco de dados é sempre assustador para mim, mas neste caso funcionou.
Para quem tiver o mesmo problema (tags duplicadas / index_tags_on_name):
Estale os dedos e inicie a Fase 1 da Inception: cd /var/discourse sudo ./launcher enter app
Se isso falhar porque você recebe algo como “nenhum contêiner docker em execução” ou similar, digite sudo docker ps -a --no-trunc
Isso listará seu contêiner docker disponível e o ID. Com isso, reinicie o contêiner. sudo docker restart <container ID>
Então sudo ./launcher enter app deve funcionar.
Acesse seu banco de dados postgres e inicie a Fase 2 da Inception: su discourse psql
O log de erro da reconstrução deve ter fornecido o nome da tag culpada. No meu caso, foi
ERROR: duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL: Key (name)=(hws-connect) already exists.
Então, primeiro procure sua tag com
select * from tags where name='hws-connect';
Isso lhe dará a tabela que você pode ver acima em minhas postagens.
Eu apenas renomeei a tag hws-connect para hws-connect1 com
UPDATE tags SET name = 'hws-connect1' WHERE name='hws-connect';
Saia da Inception com alguns chutes para trás: \q para sair do postgres exit para sair do contêiner docker
Faça a reconstrução novamente com sudo ./launcher rebuild app
Fique feliz que funcionou e verifique no front-end o que você fez:
Vá para a sua página de tags https://your-forum/tags
Não tenho ideia de como aconteceu e por que esta atualização falhou tão mal - todas as anteriores funcionaram, via web ou terminal.
Vou limpar minhas tags agora.
Bônus:
Clique na tag renomeada.
Remova-a de todos os tópicos. 3 no meu caso.
Volte para a página de tags e use o recurso no canto superior direito:
Eu também fui mordido por isso. Obrigado por compartilhar suas correções manuais, acabei de usá-las para corrigir cerca de 20 delas.
Meu fórum usava muitas tags em qualquer tipo de MixEdCasE e isso nunca foi um problema até a atualização. Parece que existe/existiu um bug que criou entradas duplicadas, independentemente da capitalização.
id | name | created_at
-------+------------------------+----------------------------
707 | ParkRide | 2019-05-21 21:36:53.213993
18982 | ParkRide | 2020-06-05 18:43:09.409895
(Sim, há diferença de espaço em branco entre eles)
Agora estou preso com um último duplicado e ele não pode ser corrigido:
discourse=> select name from tags group by name having count(*) > 1;
name
------------
Bike--Ride
(1 row)
discourse=> UPDATE tags SET name = 'Bike--Ride_2' WHERE name = 'Bike--Ride';
ERROR: duplicate key value violates unique constraint "index_tags_on_name"
DETAIL: Key (name)=(Bike--Ride_2) already exists.
discourse=> UPDATE tags SET name = 'Bike--Ride_3' WHERE name = 'Bike--Ride';
ERROR: duplicate key value violates unique constraint "index_tags_on_name"
DETAIL: Key (name)=(Bike--Ride_3) already exists.
discourse=> UPDATE tags SET name = 'something is broken here' WHERE name = 'Bike--Ride';
ERROR: duplicate key value violates unique constraint "index_tags_on_name"
DETAIL: Key (name)=(something is broken here) already exists.
enquanto a atualização falha em
2023-02-01 18:56:58.610 UTC [475] discourse@discourse ERROR: duplicate key value violates unique constraint "index_tags_on_name"
2023-02-01 18:56:58.610 UTC [475] discourse@discourse DETAIL: Key (name)=(Bike--Ride) already exists.
Tive o mesmo erro - não importa qual novo nome de tag eu usasse, ele relatava que já existia. Eu contornei isso atualizando a tag usando o id em vez da coluna name: