Major-Version-Upgrade mit pg_upgrade --link (End-to-End-Runbook)
PostgreSQLUpgradeBefehl
# As the postgres user, in a writable directory; example 16 -> 17
export OLD_BIN=/usr/pgsql-16/bin NEW_BIN=/usr/pgsql-17/bin
export OLD_DATA=/var/lib/pgsql/16/data NEW_DATA=/var/lib/pgsql/17/data
# 0) initdb the new cluster with the same encoding/locale and checksum setting as the old one (-k if the old cluster has checksums)
# 1) Compatibility check (can run while the old cluster is up, changes no data):
$NEW_BIN/pg_upgrade --old-bindir=$OLD_BIN --new-bindir=$NEW_BIN --old-datadir=$OLD_DATA --new-datadir=$NEW_DATA --check
# 2) Stop the old cluster and upgrade with hard links:
$OLD_BIN/pg_ctl -D $OLD_DATA stop -m fast
$NEW_BIN/pg_upgrade --old-bindir=$OLD_BIN --new-bindir=$NEW_BIN --old-datadir=$OLD_DATA --new-datadir=$NEW_DATA --link --jobs=4
# 3) Carry postgresql.conf/pg_hba.conf customizations over to the new cluster, start it:
$NEW_BIN/pg_ctl -D $NEW_DATA -l /tmp/pg17_start.log start
# 4) Gather statistics, run generated scripts if any:
$NEW_BIN/vacuumdb --all --analyze-in-stages
# psql -X -f update_extensions.sql (if pg_upgrade generated it)
# 5) After validation and a fresh backup, delete the old cluster:
./delete_old_cluster.shWas es tut
Prüft zuerst mit --check die Kompatibilität und führt dann das Major-Upgrade unabhängig von der Datenmenge in Minuten durch, indem die Datendateien des alten Clusters per Hardlink an die neue Version gebunden statt kopiert werden; anschließend werden Statistiken stufenweise erfasst und der alte Cluster entfernt.
Wann einsetzen
Um einen großen Cluster an Ort und Stelle mit akzeptabel kurzem Ausfall (Minuten) auf eine neue Major-Version zu bringen.
Vorsicht
Mit --link lässt sich der alte Cluster nach dem Start des neuen nicht mehr sicher verwenden; der einzige Weg zurück ist ein vor dem Upgrade erstelltes Backup. Altes und neues Datenverzeichnis müssen im selben Dateisystem liegen. Bis analyze fertig ist, können die Pläne im neuen Cluster schlecht sein. Nutzt du pgBackRest, führe stanza-upgrade aus und erstelle sofort ein neues Vollbackup; Backups der alten Version lassen sich nicht in den neuen Cluster zurückspielen.