DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

PostgreSQL: Upgrade auf neue Version durchführen

PostgreSQL Logo

Im letzten Artikel ging es um die Migration einer Nextcloud-Datenbank von MySQL/MariaDB auf PostgreSQL. Wer vielleicht schon jahrelang MySQL/MariaDB genutzt hat, für den ist der Umgang mit PostgreSQL am Anfang meist etwas ungewohnt. Ein wichtiger Aspekt ist hier das Updaten bzw. Upgraden auf eine neue Version des ORDBMS.

Daher soll dieser Artikel zeigen, wie man PostgreSQL auf eine aktuellere (Haupt-)Version updaten und bestehende Datenbanken in die neue Version überführen kann.

Dieser Artikel basiert wie immer auf einem Ubuntu Server 20.04 LTS. Ebenso setze ich voraus, dass die Paketquellen aus den offiziellen PostgreSQL-Repositories genutzt werden und nicht jene aus den Betriebssystem-Paketquellen (z.B. Ubuntu). Nur hier werden die Updates zeitnah verteilt. Wie man diese Paketquellen einbinden kann, wurde bereits im Artikel über Nextcloud/PostgreSQL erklärt.

Update-Historie (letztes Update: 01.10.2021)
  • 01.10.2021:
    • Hinweise für das Upgrade auf PostgreSQL 14 hinzugefügt (neues Hashing-Verfahren für Passwörter).

Update vs Upgrade

Zunächst müssen wir zwischen einem Update und einem Upgrade der Datenbank unterscheiden.

Ein Update bezeichnet hier die Aktualisierung des Datenbank-Systems innerhalb einer Haupt-Version (z.B. von 13.3 auf 13.4). Hier gibt es im Allgemeinen nicht sonderlich viel zu beachten, sondern das Update kann einfach über die Paket-Verwaltung angestoßen werden:

apt update && apt upgrade -V

Bei einem Upgrade dagegen wird eine neue Haupt-Version von PosrgreSQL installiert (z.B. von Version 12.8 auf 13.4).Ein Upgrade stellt demnach die Installation einer neuen Haupt-Version, Migration der Daten und ggf. das Löschen der alten PostgreSQL-Version dar.

Vor dem Upgrade sollte man auf jeden Fall prüfen, ob die verwendeten Programme mit der neueren PostgreSQL-Version kompatibel sind.

Arbeiten mit PostgreSQL-Clustern

Es gilt zu beachten, dass mehrere Versionen von PostgreSQL parallel auf einem System betrieben werden können. PostgreSQL verwaltet die Datenbanken immer in sog. Clustern. Ein Cluster ist dabei immer genau einer Version des Datenbank-Systems zugeordnet.

Um die aktiven Cluster anzuzeigen, kann folgender Befehl verwendet werden:

sudo -u postgres pg_lsclusters

Hier erhält man dann z.B. folgende Ausgabe:

12  main    5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

Der einzig aktive Cluster entspricht der PostgreSQL-Version 12 und hat den Namen 12/main.

Wenn nun zusätzlich die Version 13 von PostgreSQL installiert wird, hat man nach der Installation den zusätzlichen Cluster 13/main.

main ist übrigens der Name des einzigen Clusters, der bei der Installation einer spezifischen Version von PostgreSQL erzeugt wurde. Natürlich besteht auch die Möglichkeit, mehrere Cluster mit einer PostgreSQL-Version parallel zu betreiben oder die Cluster auch individuell umzubenennen. Da dies aber meistens gar nicht notwendig ist, gehe ich an dieser Stelle nicht näher darauf ein, sondern arbeite immer mit dem Cluster main.

Nun kann es vorkommen, dass explizit mehrere Versionen der Datenbank parallel betrieben werden müssen (z.B. weil eine Anwendung noch nicht mit PostgreSQL 13 kompatibel ist). In diesem Fall ist es bei den Befehlen auf der Kommandozeile immer wichtig, den richtigen Cluster zu adressieren. Das folgende Beispiel anhand des Befehls psql macht dies deutlich:

sudo -u postgres psql --cluster 13/main

Hier wird einfach nur die allgemeine PostgreSQL-Kommandozeile aufgerufen und zwar mit dem Cluster der Version 13. Mit der Angabe –cluster 12/main würde man dementsprechend mit dem Cluster der Version 12 arbeiten.

Im folgenden gehe ich davon aus, dass ein Parallel-Betrieb von verschiedenen Versionen von PostgreSQL nicht benötigt wird. Trotzdem werden die entsprechenden Cluster immer explizit adressiert.

Upgrade von PostgreSQL durchführen

Wenn es nun eine neue Haupt-Version von PostgreSQL gibt, kann ein Upgrade auf mehrere Arten durchgeführt werden:

  • pg_dump/pg_dumpall: Migration mittels Dump eines kompletten Clusters.
  • pg_upgrade: Dateien auf Binärebene kopieren/updaten.
  • pg_upgrade –link: Sog. “In-Place Upgrade” (kein Kopieren, sondern nur Verlinken der Binärdateien)

Am einfachsten ist hier meiner Meinung nach das Upgrade mittels Dump/Wiedereinspielen, daher wird diese Methode auch in diesem Artikel zum Einsatz kommen. Hier kann es nur u.U. zu Nachteilen kommen, wenn es sich um riesige Datenbestände handelt. In diesem Fall dauert es einfach etwas länger, bis der Dump erzeugt und wieder eingespielt wurde – hier ist mit einer längeren Downtime des Systems zu rechnen. Ebenfalls kann hier sehr viel Speicherplatz für den Dump notwendig sein. Falls dies ein Problem darstellt, kann man auch die alternativen Varianten zum Upgrade ausprobieren.

Wir führen hier nun beispielhaft ein Upgrade von PostgreSQL 12 auf Version 13 durch. Die alte Version soll dabei vom System entfernt werden.

Zunächst installieren wir die neuste Version von PostgreSQL. Da im Paketnamen keine Versionsnummer angegeben wird, handelt es sich hierbei immer um die neuste Version.

apt update && apt install postgresql

Allerdings kann man hier die gewünschte Version auf explizit mit angeben:

apt update && apt install postgresql-13

Anschließend kontrollieren wir den Port, den die alte PostgreSQL-Version verwendet (wichtig: auf Versionsnummer im Pfad achten):

nano /etc/postgresql/12/main/postgresql.conf

Ziemlich weit oben in der Konfigurations-Datei findet man nun den Port. Diesen sollten wir uns merken, da die neue Version von PostgreSQL später auf den gleichen Port konfiguriert werden muss, damit am Ende keine Programm-Konfigurationen angepasst werden müssen:

port = 5432

Nun wird auch schon ein Dump des kompletten Clusters (der Version 12) angefertigt:

cd
sudo -u postgres pg_dumpall --cluster 12/main > dump.sql

Im Anschluss kann die alte Version von PostgreSQL entfernt werden.
Achtung: Dies solltet ihr natürlich nur durchführen, wenn die alte Version nicht mehr benötigt wird, d.h. alle Anwendungen mit der neuen PostgreSQL-Version kompatibel sind.
Das purge sorgt dafür, dass die Datenbank-Dateien ebenfalls mit entfernt werden. Zu beachten ist hier die explizite Angabe der Version für die zu entfernenden Pakete:

apt purge postgresql-12 postgresql-client-12

Beim Entfernen kommt noch die Frage, ob alle Dateien entfernt werden sollen. Diese Frage ist mit “ja” zu beantworten.

PostgreSQL wird nun komplett vom System entfernt
PostgreSQL wird nun komplett vom System entfernt

Nun sollte der Port der neuen Version auf die zuvor notierte Port-Nummer geändert werden (hier wieder auf die Version im Pfad achten):

nano /etc/postgresql/13/main/postgresql.conf

Hier setzen wir den Port wieder auf 5432.

Damit diese Änderungen übernommen werden, muss PostgreSQL einmal neu gestartet werden:

service postgresql restart

Am Ende wird nun der Datenbank-Dump wieder eingespielt (wieder mit der expliziten Angabe des Clusters der Version 13):

cd
sudo -u postgres psql -d postgres --cluster 13/main -f dump.sql

Damit ist das Upgrade von PostgreSQL auch schon abgeschlossen.

Hinweise für Upgrade auf PostgreSQL 14

Beim Upgrade auf PostgreSQL 14 gibt es noch einen weiteren Punkt zu beachten: Hier ändert sich das Authentifizierungs-Verfahren von md5 auf scram-sha-256. Dabei handelt es sich um Hashing-Verfahren von Passwörtern. Weitere Informationen dazu sind in der PostgreSQL-Dokumentation zu finden.

Nach einem Update von PostgreSQL 13 auf Version 14 werden die Anwendungen zunächst einmal keine Verbindung mehr zur Datenbank aufbauen können, da sich das Hashing-Verfahren geändert hat. In diesem Fall müssen die Passwörter aller PostgreSQL-Benutzer neu gesetzt werden.

Dazu melden wir uns erst einmal auf der PostgreSQL-Kommandozeile an:

sudo -u postgres psql

Zunächst einmal kann man sich alle Datenbank-Benutzer auflisten lassen:

\du

Nun wir das Passwort eines Datenbank-Users neu gesetzt:

\password user_name

“user_name” ist dabei durch den tatsächlichen Benutzernamen zu ersetzen.
Anschließend muss das neue Passwort zwei mal eingegeben werden.
Hinweis: Das Passwort sollte in diesem Schritt nicht geändert werden, sondern es sollte das gleiche Passwort für den Benutzer verwendet werden, welches vorher auch schon genutzt wurde. Andernfalls müsste auch die Konfiguration des Programms geändert werden, welches den Datenbank-Zugriff benötigt.

Anschließend sollte der Datenbank-Zugriff wieder wie gewohnt funktionieren.

Weiterführende Artikel

Links

, , , ,

Kommentare: 7

  • Hans sagt:

    Hallo Jan,

    vielen Dank für das Update.

    Beim Einspielen des dump erhalte ich folgende Fehler.

    could not change directory to “/root”: Permission denied
    psql: error: dump.sql: No such file or directory

    Gruß Hans

  • Hans sagt:

    Hallo Jan,

    ich konnte den Fehler jetzt auf einer VM nachstellen.

    Mein Fehler war, dass ich nach dem Login mit erhöhten Rechten sudo -s die Befehle ausgeführt habe.

    Vielleicht kannst du die Info noch mit aufnehmen.

    Vielen Dank

    Gruß Hans

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.