Upgrade eines Postgres-Clusters

nach einem Upgrade der Distribution folgt meistens auch ein Upgrade des Datenbank.

Schade, dass Postgres das nicht automatisch macht, aber es wird dafür sicher Gründe geben. Der Umzug ist aber kein Beinbruch, sofern man die alten Pakete noch nicht deinstalliert hat.

Ich werde das hier gerade am Beispiel Debian 9 -> Debian 10 Upgrade zeigen. Beim Upgrade merkt apt an, dass die “alten” Pakete nicht mehr supportet sind und dass man auf die neuen umziehen möge. Die alten Postgres-Pakete werden nicht automatisch gelöscht. Das muss man am Ende des Umzugs manuell machen. Man sollte das auch nicht auf die lange Bank schieben, sondern zeitnah nach dem Upgrade machen. Sonst gibt das unter Umständen unschöne Probleme.

Wir schauen erstmal, was wir so haben:

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

Dann wird Postgres gestoppt:

systemctl stop postgresql.service
pg_lsclusters 
Ver Cluster Port Status Owner    Data directory               Log file
9.6 main    5432 down   postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
11  main    5433 down   postgres /var/lib/postgresql/11/main  /var/log/postgresql/postgresql-11-main.log

Der Umzug wird dann so gestartet:

cd /tmp
sudo -H -u postgres /usr/lib/postgresql/11/bin/pg_upgrade \
-b /usr/lib/postgresql/9.6/bin \
-B /usr/lib/postgresql/11/bin \
-d /var/lib/postgresql/9.6/main \
-D /var/lib/postgresql/11/main \
-o ' -c config_file=/etc/postgresql/9.6/main/postgresql.conf' \
-O ' -c config_file=/etc/postgresql/11/main/postgresql.conf'

Testen, ob es funktioniert:

pg_ctlcluster 11 main start

Wenn keine Fehlermeldungen gibt, muss man noch den Port in /etc/postgresql/11/main/postgresql.conf auf 5432 ändern. Beim alten Cluster wird dann der Port auf 5433 (oder irgendeinen anderen, nicht benutzten Port) gesetzt.

systemctl start postgresql.service

startet dann die Datenbank wieder. Wenn auch die Anwendung problemlos funktioniert, kann man die postgresql-9.6-Pakete deinstallieren:

apt remove postgresql-*-9.6