Dieses Tutorial zeigt wie eine PostgreSQL-Datenbank auf eine neue Hauptversion migriert wird, wie man die aktive Version auf Port 5432 verlegt und alte Versionen im PostgreSQL-Cluster löscht.

PostgreSQL-Cluster

Wird z.B. auf Ubuntu ein apt -upgrade ausgeführt so werden auch neue Hauptversionen von PostgreSQL installiert. Die Datenbank bleibt allerdings auf der bisherigen Hauptversion und für die neue Hauptversion wird ein eigener PostgreSQL-Server in einem Cluster angelegt. War bisher kein Cluster vorhanden, so wird einer angelegt. Die aktive Hauptversion ist standardmäßig auf Port 5432 gemappt. Auf Port 5432 soll nach der Migration die neueste Version (14) zu erreichen sein.

Alle am Server installierten Postgres-Versionen anzeigen:

pg_lsclusters 

Ver Cluster Port Status Owner    Data directory               Log file
9.1 main    5441 online postgres /var/lib/postgresql/9.1/main /var/log/postgresql/postgresql-9.1-main.log
9.2 main    5440 online postgres /var/lib/postgresql/9.2/main /var/log/postgresql/postgresql-9.2-main.log
9.3 main    5442 online postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
9.4 main    5437 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
9.5 main    5439 online postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log
9.6 main    5438 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
10  main    5432 online postgres /var/lib/postgresql/10/main  /var/log/postgresql/postgresql-10-main.log
11  main    5433 online postgres /var/lib/postgresql/11/main  /var/log/postgresql/postgresql-11-main.log
12  main    5434 online postgres /var/lib/postgresql/12/main  /var/log/postgresql/postgresql-12-main.log
13  main    5435 online postgres /var/lib/postgresql/13/main  /var/log/postgresql/postgresql-13-main.log
14  main    5436 online postgres /var/lib/postgresql/14/main  /var/log/postgresql/postgresql-14-main.log

Welche Version verwenden Commandline-Tools wie z.B. pg_dump?

pg_dump --version

pg_dump (PostgreSQL) 10.21 (Ubuntu 10.21-1.pgdg18.04+1)

Datenbanken migrieren

Mit pg_dump bzw. pg_dumpall hat PostgreSQL ein integriertes Tool um Datenbanken von einer Server-Version auf die Andere zu migrieren. Die offizielle Dokumentation und der Befehl pg_dump bzw. pg_dumpall sind gut und einfach erklärt. Vor diesem Vorgang stoppt man am besten noch die Applikationen welche auf die Datenbanken zugreifen.

pg_dumpall -p 5432 | psql -d postgres -p 5436

Nun verbindet sich das Skript zu jeder Datenbank, welche auf Port 5432 läuft und kopiert diese zum Server auf Port 5436. Möglicherweise wird bei jeder Datenbank das Passwort abgefragt. Dieses wird auf Ubuntu 20.04 ganz unscheinbar mit „SET“ abgefragt.

Wird die Meldung „psql: Fehler: Verbindung zum Server auf Socket »/var/run/postgresql/.s.PGSQL.5436« fehlgeschlagen: FATAL: Rolle »root« existiert nicht“ angezeigt muss zuvor zum entsprechenden Benutzer gewechselt werden – in unserem Fall heißt der Benutzer „postgres“.

Port der aktiven PostgreSQL-Version ändern

Zuerst stoppen wir die aktive Version 10 und die Zielversion 14. Dann wird die Config so geändert, dass Version 14 den Standardport 5432 verwendet und die Postgres-Server wieder gestartet.

pg_ctlcluster 10 main stop
pg_ctlcluster 14 main stop
pg_lsclusters

Ver Cluster Port Status Owner    Data directory               Log file
10  main    5436 down   postgres /var/lib/postgresql/10/main  /var/log/postgresql/postgresql-10-main.log
14  main    5432 down   postgres /var/lib/postgresql/14/main  /var/log/postgresql/postgresql-14-main.log
vim /etc/postgresql/14/main/postgresql.conf
port=5436 zu port=5432 ändern

vim /etc/postgresql/10/main/postgresql.conf 
port=5432 auf port=5436 ändern

grep -H '^port' /etc/postgresql/*/main/postgresql.conf
/etc/postgresql/10/main/postgresql.conf:port = 5432                             # (change requires restart)
/etc/postgresql/14/main/postgresql.conf:port = 5436                             # (change requires restart)
pg_ctlcluster 10 main start
pg_ctlcluster 14 main start
pg_lsclusters 

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5436 online postgres /var/lib/postgresql/10/main  /var/log/postgresql/postgresql-10-main.log
14  main    5432 online postgres /var/lib/postgresql/14/main  /var/log/postgresql/postgresql-14-main.log

Nun verwendet auch das Kommonadozeilentool pg_dump die aktuelle Version.

pg_dump --version
pg_dump (PostgreSQL) 14.4 (Ubuntu 14.4-1.pgdg18.04+1)

Alte PostgreSQL-Versionen löschen

apt-get purge postgresql-9*
apt-get purge postgresql-10
apt-get purge postgresql-11
apt-get purge postgresql-12
apt-get purge postgresql-13
apt-get purge postgresql-client-9*
apt-get purge postgresql-client-10
apt-get purge postgresql-client-11
apt-get purge postgresql-client-12
apt-get purge postgresql-client-13

pg_lsclusters

Ver Cluster Port Status Owner    Data directory              Log file
14  main    5432 online postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log