Duplikater Schlüsselwert verletzt eine eindeutige Einschränkung in einer Tabelle während des Upgrades

Hallo zusammen, ich habe ein seltsames Problem mit einem Forum, das ich betreue.

Während eines Upgrades ist auf der Seite admin/upgrade oder im Terminal ein Fehler aufgetreten, und ich erhalte folgende Meldung:

--------------------------------------------------------------------------------
1 Migration fehlgeschlagen!

Migration von „default" fehlgeschlagen
#<ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_screened_ip_addresses_on_ip_address"
DETAIL:  Key (ip_address)=(10.0.0.0/8) already exists.

Zum Glück habe ich das Forum nicht zerstört. Der Befehl ./launcher restart app (bzw. ./launcher destroy app / ./launcher start app) hat mir bereits einmal geholfen, als ich nach einem Neustart eine leere Seite hatte. Es besteht also kein Notfall, weshalb ich mich nach einer Anleitung erkundigen möchte.

Ich habe mich entschlossen, die Datenbank zu untersuchen. Ich habe einige Verweise auf die IP 10.0.0.0/8, die wie Protokolle aussehen, aber in der Tabelle screened_ip_addresses finde ich keine Duplikate.

--
-- TOC-Eintrag 6829 (class 0 OID 382198)
-- Abhängigkeiten: 657
-- Daten für Name: screened_ip_addresses; Typ: TABLE DATA; Schema: public; Owner: -
--

COPY public.screened_ip_addresses (id, ip_address, action_type, match_count, last_match_at, created_at, updated_at) FROM stdin;
236	10.0.0.0/8	2	0	\N	2020-05-24 19:44:41.587257	2020-05-24 19:44:41.587257
237	192.168.0.0/16	2	0	\N	2020-05-24 19:44:47.150337	2020-05-24 19:44:47.150337
239	172.16.0.0/12	2	0	\N	2020-05-24 19:44:57.347656	2020-05-24 19:44:57.347656
240	fc00::/7	2	0	\N	2020-05-24 19:45:02.270948	2020-05-24 19:45:02.270948
261	154.71.107.147	1	0	\N	2020-06-05 13:15:17.718236	2020-06-07 00:27:57.204765
257	154.126.107.81	1	0	\N	2020-06-02 09:51:31.191431	2020-06-07 00:27:58.538628
259	197.1.186.242	1	0	\N	2020-06-05 08:39:52.218198	2020-06-07 00:27:58.985867
258	89.158.72.7	1	0	\N	2020-06-02 20:44:41.584317	2020-06-07 00:27:59.542337
260	196.179.229.13	1	0	\N	2020-06-05 08:39:52.227515	2020-06-07 00:28:00.288445
238	127.0.0.0/8	2	0	\N	2020-05-24 19:44:52.369958	2020-05-24 19:44:52.369958

Der Forum-Administrator teilte mir mit, dass er einige IPs auf der Seite /admin/logs/screened_ip_addresses bereinigt und einige hinzugefügt hat. Ich bezweifle jedoch, dass er diese IP berührt hat. Das Seltsame ist, dass angegeben wird, die IP sei vor 14 Tagen hinzugefügt worden (das war das letzte Mal, als ich ein Upgrade durchgeführt habe, wahrscheinlich das PostgreSQL-Upgrade), obwohl das Forum aus dem Jahr 2015 stammt. Bei anderen Foren wird das Erstellungsdatum überprüft.

Ich vermute also, dass die Tabelle etwas durcheinander ist, aber es sieht nicht wirklich so aus.

Ich möchte mein Glück nicht zu sehr herausfordern, besonders weil ich nicht gut in SQL bin. Daher möchte ich eine Anleitung zum Vorgehen haben, um sicherzustellen, dass ich sicher upgraden kann: :raised_hands:

Sollte ich die Seite /admin/logs/screened_ip_addresses bereinigen, versuchen, Einträge für diese Tabelle oder eine andere zu löschen?

Das klingt, als wäre der Index beschädigt. Du kannst dich in anderen Themen zu beschädigten Indexen umsehen.

Zunächst kannst du versuchen, den Index neu zu erstellen. Beachte auch, dass viele Suchen keine doppelten Einträge finden, da sie davon ausgehen, dass der Index korrekt funktioniert.

Danke, sicher wäre es so etwas wie das?

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
REINDEX SCHEMA CONCURRENTLY public;

Wenn es nicht hilft, weil der Index für das System in Ordnung aussieht, scheint diese Lösung angesichts der Größe dieser Tabelle machbar zu sein?

TRUNCATE public.screened_ip_addresses

Führe ich dann ein Reindex durch und füge diese IPs manuell wieder hinzu?

Ich bin gerade am Handy, also musst du die RTFM lesen, aber ich würde nur public.screened_ip_addresses neu aufbauen. Ich denke, dabei wirst du Fehler wegen Konflikten bekommen.

Danke, ich habe den Befehl ausgeführt, kein Fehler wurde erwähnt. Ich werde in ein paar Stunden einen weiteren Neuaufbau versuchen und schauen, was passiert.

Edit: OK, die Neuindizierung hat nichts bewirkt.

1 Migration fehlgeschlagen!

Migration von default fehlgeschlagen
#<ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_screened_ip_addresses_on_ip_address"
DETAIL:  Key (ip_address)=(10.0.0.0/8) already exists.
>

Ich habe die App neu gestartet, alle IPs in /admin/logs/screened_ip_addresses bereinigt und erfolgreich aktualisiert.

Die IPs sind wieder da, ich musste sie nicht manuell hinzufügen.

Vielleicht war ich etwas zu vorsichtig, aber da es nicht mein Forum ist, wollte ich nichts durcheinanderbringen. Danke @pfaffman für die Hilfe!

Ich werde beim nächsten Mal schauen, ob es wieder passiert, aber wenigstens weiß ich jetzt, wie ich es beheben kann.

Letztes Update zu diesem Thema: Beim letzten Mal habe ich über die Seite admin/upgrade aktualisiert. Dieses Mal wollte ich zur Sicherheit eine Neuinstallation über das Terminal durchführen. Kein Migrationsproblem. Es hat gut funktioniert.

Ich kann bestätigen, dass das Problem behoben ist :raised_hands: