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).
Inhalt
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.

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
- Nextcloud: Migration der Datenbank von MySQL/MariaDB auf PostgreSQL
- Matrix Synapse auf Ubuntu Server 20.04 LTS mit nginx, PostgreSQL und Let’s Encrypt
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
Nachtrag:
-rw——- 1 root root 3835205 Oct 2 16:32 dump.sql
Hi Hans,
leg den Dump mal in das home-Verzeichnisses deines Users (also nicht unter /root). Dann sollte das eigentlich ohne diese Meldung durchgehen.
Gruß,
Jan
Hallo Jan,
danke, habe ich versucht, gleiches Problem.
Habe die DB über das Backup wiederhergstellt.
Vielen Dank
Gruß Hans
Hi Hans,
er will immer noch irgendwie nach /root wechseln?
Versuch mal vor dem Dump/Restore mal ein
su - postgres
(Bindestrich beachten).Gruß,
Jan
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
Hi Hans,
deshalb werden die PostgreSQL-Befehle immer mit „sudo -u postgres …“ ausgeführt.
Das sollte eigentlich so passen.
Gruß,
Jan
Hi,
ich versuche gerade ein Upgrade von Version 13 auf Version 14 durchzuführen.
Ich habe das gleiche Problem wie Hans.
user@ubuntu:~$ sudo -u postgres pg_dumpall –cluster 13/main > dump.sql
could not change directory to „/home/user“: Permission denied
Diesen Befehl wurde als normaler User ausgeführt …
Ein kleiner Nachtrag:
Ich habe das Problem gelöst, indem ich vor dem genannten Befehl:
user@ubuntu:~$ sudo -u postgres pg_dumpall –cluster 13/main > dump.sql
… die Rechte des Home-Verzeichnisses geändert habe:
sudo chmod og+X /home /home/user
… danach konnte ich der Anleitung weiter folgen.
Nachher habe ich natürlich meinem Home_Verzeichnis die ursprünglichen Rechte wiedergegeben:
sudo chmod 700 /home /home/user
Hi,
das ist natürlich eher die „Holzhammer-Methode“. Bei mir hat das Update trotz dieser Warnung bisher immer funktioniert. War das bei dir nicht der Fall?
Gruß,
Jan
Nein, leider nicht.
Manchmal muss es wohl der Holzhammer sein ;-)
Danke, hat für ein Upgrade von postgreSQL 11.2 auf 15 wunderbar funktioniert (nachdem ich mir mit pg_upgrade schon die Zähne ausgebissen hatte…)
Danke!
VG Jonathan