MANJARO wird demnächst von PostgreSQL 14 auf Version 15 wechseln.
Nachdem die letzte Änderung (13 → 14) bei mir gründlich daneben gegangen ist, bitte ich um Hilfe / Anleitung zur Übernahme meiner Daten.
Eine Besonderheit: Das Datenverzeichnis ist hier:
$ psql
postgres=# SHOW data_directory;
data_directory
-------------------------------
/mnt/Daten/Technik/PostgreSQL
bzw.
[/mnt/Daten/Technik/PostgreSQL]# ls -l
insgesamt 132
drwxr-x--- 19 postgres postgres 4096 16. Mai 2022 13
drwx------ 9 postgres postgres 4096 19. Dez 11:23 base
drwx------ 2 postgres postgres 4096 2. Feb 16:35 global
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_commit_ts
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_dynshmem
-rw------- 1 postgres postgres 4789 17. Mai 2022 pg_hba.conf
-rw------- 1 postgres postgres 1636 17. Mai 2022 pg_ident.conf
drwx------ 4 postgres postgres 4096 2. Feb 16:23 pg_logical
drwx------ 4 postgres postgres 4096 17. Mai 2022 pg_multixact
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_notify
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_replslot
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_serial
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_snapshots
drwx------ 2 postgres postgres 4096 30. Jan 08:51 pg_stat
drwx------ 2 postgres postgres 4096 2. Feb 16:40 pg_stat_tmp
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_subtrans
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_tblspc
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_twophase
-rw------- 1 postgres postgres 3 17. Mai 2022 PG_VERSION
drwx------ 3 postgres postgres 4096 30. Jan 16:41 pg_wal
drwx------ 2 postgres postgres 4096 17. Mai 2022 pg_xact
-rw------- 1 postgres postgres 88 17. Mai 2022 postgresql.auto.conf
-rw------- 1 postgres postgres 28835 17. Mai 2022 postgresql.conf
-rw------- 1 postgres postgres 48 1. Feb 18:33 postmaster.opts
-rw------- 1 postgres postgres 106 1. Feb 18:33 postmaster.pid
[/mnt/Daten/Technik/PostgreSQL]
Die alten Daten in /mnt/Daten/Technik/PostgreSQL/13 können nach dem Update weg …
Danke für jede Unterstützung!
Ein großes Dankeschön, das sieht gut aus. Aber es gibt noch Fragen:
So weit klar! Das folgende
würde mit meinem Verzeichnis dann so lauten: initdb -k --locale=de_DE.UTF-8 /mnt/Daten/Technik/PostgreSQL/data
Richtig?
Für die beiden folgenden Schritte
Warum -k = hardlink-Mode bzw. wie würde das ohne hardlink sonst aussehen?
Wie finde ich meine PGBINOLD und PGBINNEWE Verzeichnisse? Ich denke, das war mein Problem beim Wechsel 13 → 14 …
Prinzipiell ja. Ich übernehme die Einstellungen vom bisherigen Cluster, um mögliche Überraschungen zu vermeiden.
Prüfung encoding mit psql -l.
Und für die Option -k (checksum), prüfen ob diese jetzt bereits gesetzt ist psql -c "show data_checksums;".
Warum -k = hardlink-Mode bzw. wie würde das ohne hardlink sonst aussehen?
Wie finde ich meine PGBINOLD und PGBINNEWE Verzeichnisse? Ich denke, das war mein Problem beim Wechsel 13 → 14
…
PGBINOLD ist die Installation von postgresql_upgrade. Ermittlung bin-Verzeichnis: pacman -Ql postgresql-old-upgrade | grep "bin/$"
PGBINNEW die aktuelle installierte (neue) Version: pacman -Ql postgresql | grep "bin/$"
Bei -k werden die Datenfiles nicht kopiert sondern per Hardlink verknüpft. Damit braucht man nicht den doppelten Speicherplatz für die Daten. Siehe Harter Link – Wikipedia.
Das verstehe ich gar nicht …
Da kommt es drauf an, wo deine bisherige Konfiguration liegt. Entweder im Daten-Verzeichnis oder woanders bspw unter /etc
In jedem Fall wird beim Anlegen des neuen Clusters, die Konfiguration Dateien in den Default-Versionen mit angelegt.
Damit ich soweit wie möglich an der aktuelle Standard-Konfiguration bleibe, vergleiche diese mit einen Diff-Programm und übernehme meine abweichenden Einstellungen. Es gibt ja auch mal Fälle, wo Parameter wegfallen. Hätte ich diesen explizit gesetzt, müsste ich mir dann genauer überlegen, was genau die Änderung im Verhalten der DB dann für mich bewirkt.
Danke @frastr, super gut! Ich habe das mal sortiert zusammengefasst und meine Parameter eingebaut (Standards in [[]]). Fragen sind mit >FRAGE<: markiert:
EDIT: Die aktualisierte Arbeitsliste ist hier …
Danke!!
Encoding prüfen (>FRAGE<: Was wäre problematisch / eine Überraschung?)
Keine Ahnung. Ich habe es noch nicht drauf ankommen lassen. Wäre ja mal einen Test wert.
Checksum: >FRAGE<: Was bedeutet “off” für mich?
Das bisher keine Checksumme pro Datenblock gebildet und geprüft wird. Damit lassen sich eventuelle (Platten)-Fehler beim lesen/schreiben erkennen.
Hier würde ich den vorhanden Zustand für den neuen Cluster übernehmen. Man kann dann mit dem Tool pg_checksum im nachhinein Checksum aktivieren.
FRAGE: Was bedeutet /opt/pgsql13? Ist da was “faul”?
Du hast wahrscheinlich PostgreSQL in Version 14 installiert. Dann ist old die Version 13.
Im normalen Arch Linux gab es vorige Woche das Upgrade.
postgresql von 14 auf 15
postgresql-old-upgrade von 13 auf 14 (also immer die Vorgänger-Version)
Damit wird /opt/pgsql-13 deinstalliert und /opt/pgsql-14 installiert
FRAGE: Wann kann ich /opt/psql13 löschen?
Siehe vorige Antwort.
FRAGE: Wie prüfe ich, wo die bisherige Konfiguration liegt?
Sorry, noch etwas: Habe jetzt pg_upgrade --check mit den alten Verzeichnissen getestet:
$ pg_upgrade --check \
--old-bindir=/opt/pgsql-13/bin/ \
--new-bindir=/usr/bin/ \
--old-datadir=/mnt/Daten/Technik/PostgreSQL/13 \
--new-datadir=/mnt/Daten/Technik/PostgreSQL
konnte Versionsdatei »/mnt/Daten/Technik/PostgreSQL/13/PG_VERSION« nicht öffnen: Keine Berechtigung
Fehlgeschlagen, Programm wird beendet
Das Kommando muss mit dem OS-User dem das Datenverzeichnis gehört, ausgeführt werden. In der Regel ist das postgres.
Die Reihenfolge deiner Schritte stimmt nicht ganz.
Zeitpunkt ist erreicht, das die neuen Pakete zur Verfügung stehen.
Datenverzeichnis, Encoding, Checksum Infos der aktuelle Version ermitteln. Hast du ja bereits ein paarmal gemacht. Sollte reichen, ändert sich ja nicht.
Datenbank stoppen
Upgrade der Manjaro Pakte durchführen mit pacman. postgresql, postgresql-libs, postgresql-old-upgrade
initdb mit den passenden Optionen ausführen. Datenverzeichnis an der Stelle von der bisherigen Version
PGBINOLD, PGBINNEW ermitteln
pg_upgrade durchführen
Datenbank starten
pg_upgrade erzeugt noch Scripte für Wartungsarbeiten an der neuen DB, sowie zum Löschen des alten Datenverzeichnisses. Esrstes führe ich immer aus. Letzteres mache ich manuell.
FRAGE: Richtig so? Muss das als User postgres ausgeführt werden?
Am besten mit dem User dem die Dateien und Verzeichnisse gehören, oder der die Lese- und am Ziel die Schreib-Berechtigung hat. In der Regel sollte das postgres sein, wenn man dies nicht explizit geändert hat. Sieht man ja mit ls -l
Dump mit pg_dumpall (logisches Backup) und einmal das Datenverzeichnis kopieren (physikalischer Backup) ist auch doppelt gemacht. Eigentlich reicht eines davon.
Encoding und Checksum muss auch nicht jedesmal neu ermittelt werden. Das reicht einmal.
FRAGE: Funktioniert nicht “Verschieben in ein Unterverzeichnis seiner selbst nicht möglich”. Ist folgender Weg OK?
Ja sieht ok aus. Das mkdir data musst du weglassen. Das wird durch dein initdb im nächsten Schritt angelegt. Ansonsten meckert er, wenn es schon vorhanden ist.
FRAGE: Warum funktioniert --check bei mir nicht? Wegen des bereits installierten postgresql-old-upgrade 14.6.1?
Ja. postgresql und postgresql-old-upgrade müssen in den richten Versionen zu den vorhanden Version des Datenverzeichnis passen.
Also wenn dein Datenverzeichnis die Version 14 hat, dann muss zum Zeitpunkt des Upgrades postgresql-old-upgrade in Version 14 und postgresql in Version 15 installiert sein.
FRAGE: Das ist mein Stand vor Installation des MANJARO-UPdates. Der Punkt gehört verschoben hinter “-- MANJARO: Neue Version installieren”, oder?
Ja, dann aber 14 anstatt 13 bei pg_upgrade --check verwenden.
FRAGE: Ist meine Variante (ohne hardlink, meine Verzeichnisnamen) korrekt?
Ich bitte vielmals um Verzeihung, aber ich scheitere schon am ersten Punkt:
Der Besitzer laut ls -l ist postgres …
$ sudo -i -u postgres
[postgres@MaschineName ~]$ cd /mnt/Daten/Technik/PostgreSQL
[postgres@MaschineName PostgreSQL]$ sudo cp PG_VERSION /mnt/Daten/xx.txt # nur Test
[sudo] Passwort für postgres:
Das hat nicht funktioniert, bitte nochmal probieren.
Vergesse meine vorige Antwort, du Umschaltung auf den User postgres hat ja funktioniert.
Du brauchst nicht das sudo vor cp. Also hier ohne sudo ausführen.
Ich hatte versucht, in ein Verzeichnis zu kopieren, das mir gehört. Das produziert den Fehler"keine Berechtigung". Kopiere ich nach /tmp. funktioniert es (ohne sudo)
Wohin ich aber mein aktuelles Datenverzeichnis kopieren kann (um es als Sicherung zu nutzen), ist mir unklar: $ sudo cp /mnt/Daten/Technik/PostgreSQL/ ZIELunklar
Kommt, weil du als ausführender User postgres keine Berechtigung für /mnt/Daten hast.
Du musst die entsprechenden Berechtigungen für postgres vergeben. Oder du kopierst es als root.