PostgreSQL Update 14 -> 15 (MANJARO)

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!

Da es sich bei Manjaro um eine Arch Linux based Distribution handelt. Empfehle ich folgenden ArchWiki Link: PostgreSQL - ArchWiki

Danke, das hatte ich genutzt (und mir Probleme gemacht …).
Was macht postgresql-old-upgrade und kann das mit dem veränderten Datenverzeichnis umgehen?

postgresql-old-upgrade ist die alte PostgreSQL Version. Diese wird ja für das pg_upgrade benötigt.

Im allgemeinen mache ich das so.

  • Datenbank runterfahren. bzw. die Datenbank starte nicht mehr, wegen der falschen Version weil das neue Package bereits installiert wurde.
  • Neue Version installieren, falls noch nicht geschehen
  • Datenverzeichnis umbenennen mv /var/lib/postgres/data /var/lib/postgres/data_old
  • DB-Cluster in der neuen Version erzeugen: initdb -k --locale=de_DE.UTF-8 /var/lib/postgres/data
  • pg_upgrade ausführen (in diesem Fall mit -k = hardlink-Mode)
export PGDATAOLD=/var/lib/postgres/data_old/
export PGDATANEW=/var/lib/postgres/data
export PGBINOLD=/opt/pgsql-14/bin
export PGBINNEW=/usr/bin

pg_upgrade -k
  • Am Ende noch die Konfigurationen postgresql.conf, ‘pg_hba.conf’, pg_indent.conf übernehmen bzw. mergen.

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 …

Das verstehe ich gar nicht …

Ich wäre sehr dankbar für weitere Unterstützung!

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 Hardlink – 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. :slight_smile: 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?

show config_file;
show hba_file;
show ident_file;

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

Aber:

# cat /mnt/Daten/Technik/PostgreSQL/13/PG_VERSION
13

Keine Berechtigung pg_upgrade

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
  • Aktuelles Datenverzeichnis (alte Version) umbenennen/verschieben
  • 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?

14 anstelle von 13.

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.

Wie finde ich dieses Passwort? Ist das peinlich …

Probier es mal in 2 Schritten:

  1. Zu root mit sudo -i
  2. Zu postgres mit sudo -iu postgres

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.

Danke:

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

Mach mal bitte:

  • ls -l /mnt/Daten/Technik/PostgreSQL
  • ls -l {Ziel}

Danke; hier die Ergebnisse:

$ ls -l /mnt/Daten/Technik/PostgreSQL
ls: Öffnen von Verzeichnis '/mnt/Daten/Technik/PostgreSQL' nicht möglich: Keine Berechtigung
[meinName@MaschineName Daten]$ sudo -i
[MaschineName ~]# ls -l /mnt/Daten/Technik/PostgreSQL
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 12. Feb 15:22 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 12. Feb 15:26 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 12. Feb 15:21 pg_stat
drwx------  2 postgres postgres  4096 12. Feb 16:19 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  7. Feb 15:39 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 12. Feb 15:21 postmaster.opts
-rw-------  1 postgres postgres   105 12. Feb 15:21 postmaster.pid
[MaschineName ~]# ls -l /mnt/Daten
drwx------  2 meinName meinName     16384 27. Aug 08:19  lost+found
-rw-r--r--  1 meinName meinName 974171560  5. Feb 11:30 'pgDump 20230205 ALL.sql'
-rw-r--r--  1 meinName meinName     24871 12. Feb 11:12 'PostgreSQL UPDATE.txt'
-rw-r--r--  1 meinName meinName    119006 12. Feb 16:10  Screenshot_20230212_161017.png
[MaschineName ~]#

Keine Berechtigung

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.

Danke!

Dann werde ich meine Aufgabenlise in dem Punkt wieder auf root ändern

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.