Einleitung

Bei kleinen Updates im aktuellen Release muss nicht viel beachtet werden.
Etwas komplizierter wird es, wenn die größeren Sprünge durchgeführt werden müssen. Es gibt viele unterschiedliche Methoden da draußen, die folgende ist meiner Recherche nach die einfachste.

Ziele

Ein Upgrade von Major Version zu Major Version.

NEU: Für ganz ungeduldige habe ich einen Konsole only Abschnitt. Da gibts nur Befehle, keine Erklärungen.

Letzte Aktualisierung:

  • 30.11.2025: Upgrade von 13 auf 17 als Beispiel eingefügt

Voraussetzungen

Upgrade

Nach dem einloggen in das Jail z.B. mit bastille console db, wechseln wir mit cd ~ in das Home Verzeichnis und erstellen von der aktuellen PostgresSQL Version mit pkg create postgresql13-server ein Paket der alten PostgreSQL 13 Version. Dieses Paket wird dann in einen temporären Ordner ausgepackt, da wir an das "alte" Programm pg_upgrade explizit in der Version 13 nochmal ran müssen: mkdir /tmp/pg-upgrade && tar xf postgresql13-server-13.23_1.pkg -C /tmp/pg-upgrade

Hintergrund: Es können nicht zwei verschiedene PostgreSQL Versionen gleichzeitig installiert sein!

Backup

Nun ist es Zeit die alte Datenbank mit service postgresql stop zu stoppen und Datenbank Verzeichnis mit cp -r /var/db/postgres/data13 /var/db/postgres/data13.bak zu sichern.

Update

Jetzt kann die alte installierte Version mit pkg delete -f postgresql13-server postgresql13-client postgresql13-contrib entfernt und durch die neue Version mit pkg install -y postgresql17-server postgresql17-client postgresql17-contrib ersetzt werden. Diese neue Version wird dann auch direkt initialisiert: service postgresql initdb

Migration

Jetzt kommt der entscheidende Teil. Die Migration. Je nach Größe kann das natürlich etwas dauern. Dabei werden alle Datenbanken aus dem Ordner /var/db/postgres/data13/ in den neuen Ordner /var/db/postgres/data17/ kopiert und an die neue Version angepasst: su -l postgres -c "pg_upgrade -b /tmp/pg-upgrade/usr/local/bin/ -d /var/db/postgres/data13/ -B /usr/local/bin/ -D /var/db/postgres/data17/ -U postgres"

Konfiguration

Neben den Datenbanken müssen natürlich auch die aktuellen Konfigurationen übernommen werden. Zuvor sichern wir die neue "leere" Konfigurationsdatei mit cp /var/db/postgres/data17/pg_hba.conf /var/db/postgres/data17/pg_hba.conf.bak und kopieren dann die alte pg_hba.conf Datei einfach wieder in das neue Verzeichnis mit cp /var/db/postgres/data13/pg_hba.conf /var/db/postgres/data17/pg_hba.conf rein.

Aufräumen

Nun kann die Datenbank mit service postgresql start wieder gestartet und die Funktion überprüft werden. Mit /usr/local/bin/vacuumdb -U postgres --all --analyze-in-stages werden die Statistiken für die neue Datenbank erzeugt und dann kann auch die alte Datenbank mit rm -rf /var/db/postgres/data13 entfernt werden. Dabei schmeißen wir mit rm /var/db/postgres/delete_old_cluster.sh noch ein Überbleibsel weg.

Konsole

cd ~
pkg create postgresql13-server
mkdir /tmp/pg-upgrade
tar xf postgresql13-server-13.23_1.pkg -C /tmp/pg-upgrade
service postgresql stop
cp -r /var/db/postgres/data13 /var/db/postgres/data13.bak
pkg delete -f postgresql13-server postgresql13-client postgresql13-contrib
pkg install -y postgresql17-server postgresql17-client postgresql17-contrib
service postgresql initdb
su -l postgres -c "pg_upgrade -b /tmp/pg-upgrade/usr/local/bin/ -d /var/db/postgres/data13/ -B /usr/local/bin/ -D /var/db/postgres/data17/ -U postgres"
cp /var/db/postgres/data17/pg_hba.conf /var/db/postgres/data17/pg_hba.conf.bak
cp /var/db/postgres/data13/pg_hba.conf /var/db/postgres/data17/pg_hba.conf
service postgresql start
/usr/local/bin/vacuumdb -U postgres --all --analyze-in-stages
rm -rf /var/db/postgres/data13
rm /var/db/postgres/delete_old_cluster.sh

Voilá