PostgreSQL ist eines der populärsten und mächtigsten Datenbankmanagementsysteme und zu dem noch Open Source. Dieser Blog-Artikel erklärt die Installation, Konfiguration und das Aktualisieren von PostgreSQL 17 unter Ubuntu Server 24.04 LTS.
Einführung
PostgreSQL ist ein freies, objektrelationales Datenbankmanagementsystem, das den größten Teil des SQL-Standards abbildet und diesen um einige Erweiterungen ergänzt. Die Open-Source-Lizenz von PostgreSQL ist sehr liberal und entspricht in etwa der MIT-Lizenz. PostgreSQL läuft unter Windows, Linux, macOS sowie weiteren Unix-Derivaten.
Version 17 wurde am 26. September 2024 veröffentlicht und wird das letzte Update am 8. November 2029 erhalten. Der Lebenszyklus beträgt also wie bei älteren Versionen auch fünf Jahre.
In der Tat haben wir nur positive Erfahrungen mit PostgreSQL gemacht und setzen diese Datenbank daher auch in unserem Open-Source-Projekt Enbrea ein.
Installieren
Als erstes wollen wir das apt-Repository von PostgreSQL in unserem Ubuntu-Server registrieren:
$ echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
Anschließend wird der PostgreSQL-Signaturschlüssel importiert. Dieser wird für die Überprüfung des Installationspakets aus dem soeben registrierten apt-Repository benötigt.
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
Ist es auch der richtige Signaturschlüssel?
$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/postgresql-key.gpg
Das Ergebnis sollte in etwa so aussehen:
pub rsa4096 2011-10-13 [SC]
B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
uid PostgreSQL Debian Repository
So, jetzt sind die Vorbereitungen abgeschlossen. Wir können die eigentliche Installation von PostgreSQL starten:
$ sudo apt update && sudo apt install postgresql-17 postgresql-client-17
Das dauert jetzt ein Weilchen. Aber am Ende sollte der PostgreSQL-Dienst erfolgreich gestartet sein.
Wir können dies wie folgt überprüfen:
$ systemctl status postgresql.service
Die Antwort sollte in etwa so aussehen:
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; preset: enabled)
Active: active (exited) since Tue 2024-10-01 12:00:00 UTC; 23min ago
Main PID: 7007 (code=exited, status=0/SUCCESS)
CPU: 1ms
Möchtest Du die exakte Version Deines PostgreSQL-Servers ermitteln, dann tippe folgendes ein:
$ pg_config --version
Die Antwort sollte in etwa so aussehen:
PostgreSQL 17.0 (Ubuntu 17.0-1.pgdg24.04+1)
Ein erster Überblick
Schauen wir uns die Installation von PostgreSQL genauer an:
-
Die Installation hat einen neuen Ubuntu-Benutzer
postgres
angelegt. Dieser Benutzer ist Eigentümer (owner) des Serverprozesses und hat standardmäßig kein Kennwort (man kann sich also nicht direkt mitpostgres
unter Ubuntu anmelden). -
Die Installation hat automatisch einen neuen Cluster unter dem Verzeichnis
/etc/postgres/17/main
angelegt. Ein Datenbank-Cluster umfasst alle Datenbanken, die von einer einzelnen PostgreSQL-Server-Instanz verwaltet werden. -
Der superuser dieses Clusters heißt ebenfalls
postgres
. Hierbei handelt es sich aber um einen PostgreSQL-Benutzer, der nichts mit dem Ubuntu-Userpostgres
zu tun hat. -
Das Binärverzeichnis liegt unter
/usr/lib/postgresql/17/bin
. -
Das Datenverzeichnis liegt unter
/var/lib/postgresql/17/main
. -
Die Log-Datei liegt unter
/var/log/postgresql/postgresql-17-main.log
. -
Die Standardkonfigurationsdatei für den Cluster lautet
/etc/postgresql/17/main/postgresql.conf
. -
Die Konfigurationsdatei zur Client-Authentifizierung liegt unter
/etc/postgresql/17/main/pg_hba.conf
. Hier wird festgelegt, welche Clients sich von woher mit welcher Authentifizierungsmethode an diesem PostgreSQL-Server anmelden können.
Die wesentlichen Daten zu unserem Cluster können wir jederzeit per pg_lsclusters abfragen:
$ pg_lsclusters
Die Antwort sollte in etwa so aussehen:
Ver Cluster Port Status Owner Data directory Log file
17 main 5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log
Authentifizierung
Standardmäßig sind in der Konfigurationsdatei pg_hba.conf
folgende Authentifizierungsmethoden definiert:
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
Nur lokale Zugriffe sind erlaubt, d.h. nur lokale Dienste oder Anwendungen, die sich per SSH mit dem Ubuntu-Server verbinden, können auf PostgreSQL zugreifen. Umgekehrt heißt dies, ein Remote-Zugriff via TCP/IP von außen ist standardmäßig unterbunden. Dies ist auch gut so und sollte nur mit Bedacht geändert werden.
Der Inhalt dieser Datei wird ausführlich in der PostgreSQL-Dokumentation beschrieben.
Lokalisierung
In der PostgreSQL-Konfigurationsdatei kannst Du die Sektion CLIENT CONNECTION DEFAULTS an Deine Bedürfnisse anpassen.
$ sudo nano /etc/postgresql/17/main/postgresql.conf
Zwei interessante Parameter sind datestyle
und timezone
. Ist Dein Ubuntu-Server beispielsweise auf Englisch eingestellt, kannst Du beide Parameter auf Deutsch umstellen:
datestyle = 'iso, dmy'
timezone = 'CET'
Vergiss bitte nicht, den PostgreSQL-Server nach jeder Änderung in der PostgreSQL-Konfigurationsdatei neu zu starten.
$ sudo systemctl restart postgresql.service
Cluster neu erstellen
Die apt-Installation von PostgreSQL richtet automatisch einen neuen Datenbank-Cluster ein. Wem das nicht gefällt, der kann diesen löschen und anschließend einen neuen Datenbank-Cluster nach seinen eigenen Wünschen erstellen. Die Werkzeuge dafür heißen pg_dropcluster und pg_createcluster.
Ein Beispiel:
-
PostgreSQL-Dienst stoppen:
$ sudo systemctl stop postgresql.service
-
Als Benutzer
postgres
agieren:$ sudo -u postgres -i
-
Aktuellen Datenbank-Cluster löschen:
$ pg_dropcluster --stop 17 main
-
Neuen Datenbank-Cluster erzeugen:
$ pg_createcluster 17 mycluster -- -U postgres -W -A scram-sha-256 -E utf8
-
Die Sitzung für Benutzer
postgres
wieder verlassen:$ exit
-
PostgreSQL-Dienst wieder starten:
$ sudo systemctl start postgresql.service
-
Abschließende Kontrolle:
$ pg_lsclusters
Cluster umbenennen
Manchmal möchte man einen Cluster nicht gleich neu erstellen, sondern lediglich umbenennen. Auch dafür gibt es ein Werkzeug namens pg_renamecluster.
Ein Beispiel:
$ sudo pg_renamecluster 17 main mein_cluster
Der Cluster wird zunächst gestoppt, dann von main
nach mein_cluster
umbenannt und anschließend wieder gestartet.
Updates einspielen
Die Versionsnummern von PostgreSQL bestehen seit Version 10 immer aus einer Major-Nummer und einer Minor-Nummer.
Beispiel: In der Versionsnummer 16.1 ist 16 die Major-Nummer und 1 die Minor-Nummer.
Es gilt dabei folgende Regel:
-
PostgreSQL-Versionen mit derselben Major-Nummer sind untereinander kompatibel, was das interne Datenbankspeicherformat angeht. Da bedeutet, Updates innerhalb einer Major-Version (z.B. von 17.0 auf 17.1) bedürfen keiner Datenbankmigration.
-
PostgreSQL-Versionen mit unterschiedlichen Major-Nummern sind untereinander inkompatibel, was das interne Datenbankspeicherformat angeht. Da bedeutet, Updates zwischen Major-Versionen (z.B. von 16.4 auf 17.0) bedürfen einer Datenbankmigration. Der Aufwand für solche Updates ist also höher.
Aktualisierung zwischen Minor-Versionen
Bei einer Aktualisierung von PostgreSQL zwischen zwei Minor-Versionen, kannst Du einfach die Packages per apt
aktualisieren.
sudo apt update && sudo apt upgrade
Die Datenbankdateien bleiben unverändert. Grundsätzlich sollte man regelmäßig auf die neueste Minor-Version aktualisieren.
Aktualisierung zwischen Major-Versionen
Bei einer Aktualisierung von PostgreSQL zwischen zwei Major-Versionen ist es etwas komplizierter, da alle Datenbanken migriert werden müssen.
Die Vorgehensweise besteht ganz grob aus vier Schritten:
-
Installiere die neue PostgreSQL-Version parallel zur bisherigen PostgreSQL-Version.
-
Lösche den automatisch erzeugten Cluster der neuen PostgreSQL-Version mittels pg_dropcluster.
-
Führe eine Migration der Datenbanken mittels pg_upgradecluster durch.
-
Deinstalliere die alte PostgreSQL-Version.
Beispielhafte Aktualisierung von 16.4 auf 17.0:
-
Stoppe PostgreSQL 16.4:
$ sudo systemctl stop postgresql@16-main
-
Installiere und konfiguriere PostgreSQL 17.0.
-
Stoppe PostgreSQL 17.0 und lösche den durch die Installation automatisch eingerichteten Cluster:
$ sudo systemctl stop postgresql@17-main $ sudo pg_dropcluster 17 main --stop
-
Starte die Migration von 16.4 auf 17.0.
$ sudo pg_upgradecluster -v 17 16 main -m=upgrade
Es wird automatisch ein neuer Cluster für PostgreSQL 17 erstellt. Das kann je nach Anzahl und Größe der Datenbanken etwas dauern.
Wenn erfolgreich beendet, kannst Du den neuen PostgreSQL-Server starten und mit ihm arbeiten.
$ sudo systemctl start postgresql@17-main
Wenn Du Dir absolut sicher bist, dass alles in Ordnung ist, kannst Du den alten PostgreSQL-Server komplett löschen.
$ sudo pg_dropcluster 16 main
$ sudo apt --purge remove postgresql-16 postgresql-client-16
Administrationswerkzeuge
psql
Wer mal eben schnell einen SQL-Befehl loswerden möchte, kann sich lokal per psql (PostgreSQL interactive terminal) anmelden.
Dazu solltest Du zunächst in die Rolle des Benutzers postgres
schlüpfen:
$ sudo -u postgres -i
Und dann:
$ psql
Es erscheint folgende Eingabeaufforderung:
psql (17.0 (Ubuntu 17.0-1.pgdg24.04+1))
Type "help" for help.
postgres=#
Als kleines Beispiel wollen wir jetzt die aktuelle Version von PostgreSQL per SQL erfragen:
postgres=# SELECT version();
Um psql wieder zu verlassen, gibt man \q
ein und bestätigt.
pgAdmin
pgAdmin ist eine freie Open-Source-Software mit einer grafischen Oberfläche, um PostgreSQL-Datenbanken zu entwickeln und zu administrieren. pgAdmin 4 läuft unter Windows, Linux, macOS sowie weiteren Unix-Derivaten. Unterstützt werden alle Versionen von PostgreSQL, deren Lebenszyklus noch nichtg abgelaufen ist (siehe PostgreSQL Versioning Policy). Du kannst pgAdmin auf Deinem lokalen Computer installieren und per SSH auf die PostgreSQL-Instanz Deines Ubuntu-Server zugreifen.
Eine ausführliche Installationsanleitung für Windows findest Du in diesem Blog-Artikel.
Artikelhistorie
- 14.10.2021
- Erstveröffentlichung für PostgreSQL 14
- 01.10.2024
- Update auf PostgreSQL 17 + Ubuntu Server 24.04 LTS
- Einige kleinere Ergänzungen