Da gehirneimer heute mit Serverproblemen zu kämpfen hatte habe ich mir gedacht ich spiele mal die neuste Version der Datenbank Software (PostgreSQL) auf (von v14 -> v16). Dabei ist mir leider ein Missgeschick unterlaufen und ich habe die aktuelle Fassung der Datenbank gelöscht. Ich habe jetzt das letzte Backup wiederhergestellt und alles scheint wieder zu funktionieren, allerdings fehlen uns jetzt erstmal einige Posts… Ich entschuldige mich aufrichtig dafür, sowas kann leider mal passieren, weswegen eine gute Backup Strategie enorm wichtig ist…
Die Story
Heute morgen um 4 Uhr hat der Server angefangen mir eine zu hohe Auslastung zu melden. Ich habe mir erstmal nichts dabei gedacht, kann ja sein dass einfach einiges los war. Ich habe es erst gegen 9:30 Uhr untersucht. Da ist mir dann aufgefallen dass sehr viel CPU Zeit dafür drauf ging auf die Festplatte zu warten (IO-Wait), das hab ich so noch nicht gesehen und hat mich sehr verwundert. Ich habe die Caches geleert, den Server neu gestartet und mir nochmal die letzten Änderungen an der Konfiguration angesehen, aber mir ist nichts aufgefallen. Ich habe dennoch die Konfiguration für den Redis Cache zurück gedreht um Fehler auszuschließen, das hat jedoch nichts gebracht…
Nach einer Weile musste ich mich damit zufrieden geben die Hintergrunddienste zurück zu schrauben, damit der Server nicht komplett lahmgelegt wird, denn ich musste frühstücken und hatte etwas vor. Hetzner habe ich aber noch kontaktiert befor ich losgegangen bin.
Als ich dann später wieder Zeit hatte hab ich dann angefangen nach Lösungen zu suchen. Ich habe mir gedacht dass es helfen könnte die Datenbank zu aktualisieren, da dies das Hauptproblem war/ist. Die DB verursacht nunmal die meiste Arbeit für Festplatten.
Die Seite die ich zurate gezogen habe hat ausdrücklich gesagt dass eine neue Version erstellt wird die die Daten der letzten Version weiter benutzt. Ich konnte die beiden Versionen nicht parallel laufen lassen (was eigentlich vorgesehen ist, damit man keinerlei downtime hat), da der Arbeitspeicher den der Server hat dafür einfach nicht ausreicht. Also hab ich probiert die alte Version zu stoppen damit ich die neue starten kann (da RAM frei wird). Der Befehl klang schon verdächtig danach dass die Version damit nicht nur heruntergefahren, sondern einfach gelöscht wird (der Befehl lautete pg_dropcluster 16 main --stop
), aber ich habe mir gedacht “ist ja nicht schlimm, die neue Version nutzt ja einfach dieselben Daten”. Tja denkste… die Daten wurden durch diesen Befehl einfach gelöscht.
Und so begann der Prozess der Wiederherstellung der DB der leider auch einige Stunden gedauert hat…
Der Artikel dazu den ich absolut nicht empfehlen kann: https://medium.com/@malymohsem/say-goodbye-to-downtime-upgrade-postgresql-14-to-16-effortlessly-with-pg-upgrade-42ef4dbf8524
@[email protected] “Der Artikel dazu den ich absolut nicht empfehlen kann”?
Nicht? Warum?
“sudo pg_dropcluster 16 main --stop” Damit soll Version 16 gestoppt werden. Und danach: “sudo pg_upgradecluster 14 main” (upgrade 14->16). Sie sollten Version 14 also nicht stoppen.
Wo genau ist also der Fehler aufgetreten?Weil der Artikel davon ausgeht dass man beide postgresql Versionen parrallel laufen lassen kann und keine Option anbietet falls es nicht funktioniert. Eigentlich hätte ich laut dem Artikel keinen Datenverlust erleiden dürfen
Monitor the process, and upon success, confidently remove the older version.
sudo pg_dropcluster 14 main
Das heißt, soweit ich das verstehe, dass eigentlich die Daten bei dem neuen Cluster eingespielt werden sollten, das ist aber nicht passiert. Vermutlich einfach weil das neue 16er Cluster bei mir nicht starten konnte. Der Artikel erwähnt davon aber nichts…
@[email protected] Tatsächlich scheint die Migration einfach nicht gut verlaufen zu sein.