heute habe ich unsere Discourse-App auf 3.0.1 aktualisiert. Das Update schlug fehl, als versucht wurde, die Postgres-Migration zu verarbeiten.
Speziell hier:
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:
Einige Tags schienen Duplikate zu haben. Ich habe mich mit Postgres verbunden und die Tags korrigiert. Die Migration und das Update liefen danach durch.
Meine Frage ist, ob ich es richtig gemacht habe, indem ich in der Datenbank herumgefummelt habe? Ich habe nur den Namen der doppelten Tags geändert.
Ich kann nicht sagen, wie die doppelten Tags erstellt wurden. Sie wurden in den letzten 2 bis 3 Jahren eingefügt.
Ich bin mir nicht sicher, ob diese Situation wieder auftreten könnte.
Ja. Das liegt auch an doppelten Tags / index_tags_on_name.
In meinem Fall heißt der Tag nur anders.
Versuche gerade herauszufinden:
wie ich Ruby auf 3.0.0 upgraden kann, da es sich beschwert, dass web-push bei 2.6.7 liegt, sodass ich nicht einmal rails c eingeben kann, um schicke Befehle zum Reparieren von Tags auszuführen
wie ich den Tag sicher aus der Postgres-Datenbank löschen kann, aber noch keine Ahnung habe
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.
Dieser Fehler tritt 3 Mal auf, da das Tag in 3 Themen gefunden zu werden scheint.
Ich bedauere, dass ich Tags aktiviert habe, wenn ich gewusst hätte, dass dies passieren würde, und warum es im Frontend keine Warnung gab.
Ich möchte sie nur löschen und mein Forum endlich wieder zum Laufen bringen
Meine Frage ist, ob ich den Tag „hws-connect“ in der Datenbank umbenennen kann, ohne die Discourse-Infrastruktur zu beschädigen?
Und… wie kann ich ihn über Postgres umbenennen?
Sie müssen gelegentliche Störungen akzeptieren, wenn Sie Ihre eigene Installation von millionenschwerer Software betreiben (unterstützt von einer super hilfreichen Community), die Sie (fast) kostenlos nutzen können.
Ich habe kürzlich zwei Websites aktualisiert, die intensiv Tags verwenden, und hatte keine Probleme.
In meinen > 5 Jahren, in denen ich mehrere Discourse-Instanzen betrieben habe, hatte ich ein solches Problem vielleicht einmal?
Wie auch immer, es sieht sehr ähnlich aus wie dieses Problem, vielleicht können Sie eine ähnliche Strategie zur Lösung verwenden?:
Es sieht so aus, als wären Sie hier bereits auf dem richtigen Weg, Sie müssen ihn nur weiterverfolgen …
Ich weiß, und es hat nichts mit Discourse oder dem Upgrade selbst zu tun. Es passiert und es ist in Ordnung.
Ich wünschte nur, ich würde nicht in einem festgefahrenen Szenario landen, in dem ich gegen so viele Themen kämpfen muss (Docker, Ruby, Postgres, Discourse). Das ist nicht mein tägliches Geschäft und es ist zeitaufwendig.
Danke für den Link!
Ich werde meinen Status aktualisieren.
Update: Das Beste aus deinem Thema, @merefield, war:
Ich schätze, ich sollte mutig sein
Das Herumfummeln in einer Datenbank ist für mich immer beängstigend, aber in diesem Fall hat es funktioniert.
Für alle mit demselben Problem (duplizierte Tags / index_tags_on_name):
Knacke deine Finger und starte Inception Phase 1: cd /var/discourse sudo ./launcher enter app
Wenn dies fehlschlägt, weil du etwas wie “no docker container running” oder so etwas erhältst, tippe sudo docker ps -a --no-trunc
Dies listet deinen verfügbaren Docker-Container und die ID auf. Damit startest du den Container neu. sudo docker restart <container ID>
Dann sollte sudo ./launcher enter app funktionieren.
Greife auf deine Postgres-DB zu und starte Inception Phase 2: su discourse psql
Das Rebuild-Fehlerprotokoll sollte dir den schuldigen Tag-Namen gegeben haben. In meinem Fall war es
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.
Suche also zuerst nach deinem Tag mit
select * from tags where name='hws-connect';
Das gibt dir die Tabelle, die du oben in meinen Beiträgen sehen kannst.
Ich habe den Tag hws-connect einfach in hws-connect1 umbenannt mit
UPDATE tags SET name = 'hws-connect1' WHERE name='hws-connect';
Verlasse Inception mit ein paar Rückwärtssprüngen: \q zum Verlassen von postgres exit zum Verlassen des Docker-Containers
Führe den Rebuild erneut mit sudo ./launcher rebuild app durch
Freue dich, dass es funktioniert, und überprüfe im Frontend, was du getan hast:
Gehe zu deiner Tag-Seite https://your-forum/tags
Ich habe keine Ahnung, wie es passiert ist und warum dieses Upgrade so schlecht fehlgeschlagen ist - alle vorherigen funktionierten, über Web oder Terminal.
Ich werde meine Tags jetzt aufräumen.
Bonus:
Klicke auf den umbenannten Tag.
Entferne ihn aus allen Themen. In meinem Fall 3.
Gehe zurück zur Tag-Seite und benutze die Funktion oben rechts:
Ich bin auch davon betroffen. Danke für das Teilen deiner manuellen Korrekturen, ich habe gerade damit ~20 davon behoben.
Mein Forum hat viele Tags in jeglicher Schreibweise verwendet und das war bis zum Upgrade nie ein Problem. Es scheint, als ob es einen Bug gab/gibt, der Duplikate unabhängig von der Groß-/Kleinschreibung erzeugte.
id | name | created_at
-------+------------------------+----------------------------
707 | ParkRide | 2019-05-21 21:36:53.213993
18982 | ParkRide | 2020-06-05 18:43:09.409895
(Ja, es gibt Unterschiede im Leerraum darum)
Ich habe jetzt noch ein letztes Duplikat und es kann nicht behoben werden:
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.
während das Upgrade fehlschlägt bei
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.
Ich hatte den gleichen Fehler – egal welchen neuen Tag-Namen ich verwendete, es wurde gemeldet, dass er bereits existiert. Ich habe es umgangen, indem ich den Tag anhand der ID anstelle der Namensspalte aktualisiert habe: