Ich habe ein Postgres DB 9.3.2 -> 10.5 mit pg_upgrade (an Ort und Stelle) aktualisiert. Ich habe alles gemäß der Dokumentation und den Anweisungen von pg_upgrade gemacht. Alles lief gut, aber dann wurde mir klar, dass die Indizes nicht in einer der Tabellen verwendet wurden (möglicherweise sind auch andere betroffen).
Also habe ich ANALYZE
gestern einen Tisch gestartet , der noch läuft (seit über 22h) ...!
Die Frage: Ist es normal ANALYZE
, eine so lange Ausführungszeit zu haben?
Die Tabelle enthält ungefähr 30 Millionen Datensätze. Die Struktur ist:
CREATE TABLE public.chs_contact_history_events (
event_id bigint NOT NULL
DEFAULT nextval('chs_contact_history_events_event_id_seq'::regclass),
chs_id integer NOT NULL,
event_timestamp bigint NOT NULL,
party_id integer NOT NULL,
event integer NOT NULL,
cause integer NOT NULL,
text text COLLATE pg_catalog."default",
timestamp_offset integer,
CONSTRAINT pk_contact_history_events PRIMARY KEY (event_id)
);
ALTER TABLE public.chs_contact_history_events OWNER to c_chs;
CREATE INDEX ix_chs_contact_history_events_chsid
ON public.chs_contact_history_events USING hash (chs_id)
TABLESPACE pg_default;
CREATE INDEX ix_chs_contact_history_events_id
ON public.chs_contact_history_events USING btree (event_id)
TABLESPACE pg_default;
CREATE INDEX ix_history_events_partyid
ON public.chs_contact_history_events USING hash (party_id)
TABLESPACE pg_default;
AKTUALISIEREN:
Ich habe die folgende Abfrage ausgeführt, um die aktuell ausgeführten Prozesse zu erhalten und mehr als interessante Ergebnisse zu erzielen:
SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes'
AND state = 'active';
Es scheint, dass die Wartungsaufgaben und die gleichzeitige Neuerstellung der Indextabelle eingefroren sind!
Die nächste Frage lautet also: Ist es sicher, diese Prozesse abzubrechen? Und was als nächstes zu tun? IMO wird sie alle stoppen und die Indexerstellung neu starten, aber ich bin mir nicht sicher.
ANHANG 1
Möglicherweise verwandte Fehler in Version 9 korrigiert:
9.3.7 und 9.4.2 Behebung eines möglichen Fehlers während der Aufteilung des Hash-Index-Buckets, wenn andere Prozesse den Index gleichzeitig ändern
9.3.18 und 9.4.13 sowie 9.5.8 und 9.6.4 Korrigieren Sie die Beschädigung der gemeinsam genutzten Prädikatsperr-Hash-Tabelle mit geringer Wahrscheinlichkeit in Windows-Builds
9.5.4 Fehler beim Erstellen großer Hash-Indizes (größer als shared_buffers) behoben Der für große Indizes verwendete Codepfad enthielt einen Fehler, der dazu führte, dass falsche Hash-Werte in den Index eingefügt wurden, sodass nachfolgende Indexsuchen immer fehlschlugen, mit Ausnahme von Tupeln, die in den Index eingefügt wurden nach dem ersten Build.
Möglicherweise verwandte Fehler in Version 10 korrigiert:
10.2 Fehler behoben, bei dem die Metapage eines Hash-Index nach dem Hinzufügen einer neuen Überlaufseite als fehlerhaft markiert wurde, was möglicherweise zu einer Beschädigung des Index führte
Verhindern Sie Speicherausfälle aufgrund von übermäßigem Wachstum einfacher Hash-Tabellen
Und last but not least macht mir das Sorgen (da ein Upgrade in der produktiven Umgebung nicht realistisch zu sein scheint):
10.6 Vermeiden Sie ein Überlaufen der Metapage eines Hash-Index, wenn BLCKSZ kleiner als die Standardeinstellung ist
Behebung von Aktualisierungen der fehlenden Seitenprüfsumme in Hash-Indizes
ANHANG 2
Upgrade-Anleitung in Version 10:
Hash-Indizes müssen nach pg_upgrade von einer früheren Hauptversion von PostgreSQL neu erstellt werden
Wesentliche Verbesserungen des Hash-Index machten diese Anforderung erforderlich. pg_upgrade erstellt dazu ein Skript.
Beachten Sie, dass ich dieses Skript natürlich zum Zeitpunkt des Upgrades ausgeführt habe.
CREATE INDEX CONCURRENTLY
Prozess beenden, der hier der Schuldige zu sein scheint. Dann , wenn die manuelle ANALYZE
und autovacuum
noch nicht nach einiger Zeit nicht beenden kann, töten diejenigen, auch. Dann würde ich fehlerhaften RAM auf dem Server ausschließen. Dann würde ich alle Hash-Indizes vollständig löschen, den DB-Cluster neu starten (falls dies eine Option ist) und auf die neueste Version von Postgres 10.6 (zwei weitere kleinere Korrekturen für Hash-Indizes) oder 11.1 aktualisieren. Erstellen Sie dann nicht alle Hash-Indizes neu CONCURRENTLY
.
Starting with PostgreSQL 10, a major version is indicated by increasing the first part of the version, e.g. 10 to 11. Before PostgreSQL 10, a major version was indicated by increasing either the first or second part of the version number, e.g. 9.5 to 9.6.