In PostgreSQL erfolgt das Upgrade der Version auf verschiedene Arten:
Installation von Paketen mit der neuen PostgreSQL-Version. Diese Methode ist nur für kleinere Updates geeignet. Vor der Durchführung des Upgrades sollten die Release-Notizen gelesen werden;
Verwendung des standardmäßigen pg_dumpall-Programms. Dies ist eine zuverlässige Methode, kann jedoch zu längeren Ausfallzeiten führen;
Verwendung des standardmäßigen pg_upgrade-Programms. Eine weitere schnelle Möglichkeit für das Upgrade, aber es können Fehler auftreten;
Durchführung des Upgrades über logische Replikation. Diese Option hat minimale Ausfallzeiten, ist jedoch nur für PostgreSQL-Versionen größer als 10.0 geeignet. Ältere Versionen erfordern Erweiterungen.
Die Wahl der Methode hängt davon ab, welche Version auf dem Server verwendet wird und auf welche Version Sie aktualisieren möchten.
In diesem Artikel gehen wir auf alle oben genannten Upgrade-Methoden ein.
Das Wichtigste ist, die Besonderheiten des Upgrades zwischen verschiedenen Versionen zu verstehen.
Die Versionsnummern bestehen aus zwei Ziffern, z. B. 10.1. Die erste Ziffer ist die Hauptversionsnummer (10) und die zweite Ziffer ist die Nebenversionsnummer (1).
Vor PostgreSQL 10 bestanden die Versionsnummern aus drei Ziffern. Zum Beispiel war in 9.6.3 die Hauptversionsnummer 9.6 und die Nebenversionsnummer 3.
Sie müssen diesen Unterschied verstehen, um die richtige Upgrade-Methode auszuwählen.
In Nebenversionen ändert sich das Datenformat nicht, sodass es keine Kompatibilitätsprobleme gibt. Daher ist der Übergang von PostgreSQL 10.1 auf 10.6 sehr einfach. Um das Upgrade durchzuführen, schalten Sie den Server aus, ersetzen Sie die ausführbaren Dateien und starten Sie den Server erneut.
Die Dokumentation weist jedoch darauf hin, dass einige Releases manuelle Änderungen erfordern können. Lesen Sie daher immer die Release-Notizen, bevor Sie ein Upgrade durchführen.
In Hauptversionen kann sich das Datenformat ändern, was das Upgrade erschwert. Sie müssen entweder die Daten entladen und erneut hochladen, das pg_upgrade-Programm verwenden oder die logische Replikation einsetzen.
Schauen wir uns an, wie man PostgreSQL Version 14.1 auf PostgreSQL 14.3 auf einem Ubuntu-Server aktualisiert.
PostgreSQL ist standardmäßig auf Ubuntu verfügbar. Starten Sie mit dem Befehl:
sudo apt-get upgrade
Debian und Ubuntu veröffentlichen nur eine Version von PostgreSQL pro OS-Release. Zum Beispiel hat Debian Squeeze/6.0 nur PostgreSQL 8.4. Wenn Sie eine andere Version benötigen, verwenden Sie die Pakete von PGDG.
Wenn Sie die neueste Version von PostgreSQL möchten, müssen Sie zuerst das Postgres-Repository installieren:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Importieren Sie den Signierschlüssel:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Aktualisieren Sie die Liste der Pakete im System:
sudo apt-get update
Installieren Sie die erforderliche PostgreSQL-Version:
sudo apt-get -y install postgresql-14.3
Um die Liste der installierten DBMSs anzuzeigen, führen Sie folgenden Befehl aus:
dpkg --get-selections | grep postgres
Sehen Sie sich auch die Liste der Cluster an:
pg_lsclusters
Stoppen Sie PostgreSQL vor den Änderungen:
sudo service postgresql stop
Wenn die Postgres-Pakete installiert sind, wird ein Standard-Cluster erstellt. Benennen Sie den neuen Postgres-Cluster um, um Konflikte mit dem alten Clusternamen beim Upgrade zu vermeiden:
sudo pg_renamecluster 14.3 main main_pristine
Führen Sie das Upgrade des alten Clusters durch:
sudo pg_upgradecluster 14.1 main
Starten Sie den Dienst:
sudo service postgresql start
Überprüfen Sie erneut die Liste der Cluster und stellen Sie sicher, dass der neue Cluster funktioniert:
pg_lsclusters
Löschen Sie den alten Cluster:
sudo pg_dropcluster 14.1 main
Wenn Sie die Hauptversion ändern müssen, verwenden Sie das Programm pg_dumpall. Das Wesentliche dieser Methode ist es, Daten aus einer Hauptversion zu entladen und sie dann in eine andere Version zu laden.
Bevor Sie Daten entladen, stellen Sie sicher, dass derzeit keine Änderungen an der Datenbank vorgenommen werden. Andernfalls können einige Änderungen im endgültigen Dump fehlen.
Holen Sie den Dump und schreiben Sie ihn in eine Datei:
pg_dumpall > output_file
Stoppen Sie den Server:
pg_ctl stop
Ändern Sie den Namen des alten Verzeichnisses, um Namenskonflikte zu vermeiden:
mv /usr/local/pgsql /usr/local/pgsql.old
Das alte Verzeichnis kann einfach gelöscht werden. Es wäre jedoch klüger, es umzubenennen, um Platz für die Wiederherstellung zu lassen. Geben Sie anstelle von /usr/local/pgsql den Pfad zu Ihrem Verzeichnis an.
Installieren Sie die neue Version aus dem Quellcode. Eine detaillierte Anleitung finden Sie in der Dokumentation.
Erstellen Sie einen neuen Cluster:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
Übertragen Sie alle Änderungen an den Dateien pg_hba.conf und postgresql.conf.
Starten Sie den Datenbank-Server:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
Stellen Sie die Daten aus dem Backup wieder her:
/usr/local/pgsql/bin/psql -d postgres -f output_file
Der Nachteil dieser Methode ist, dass der Server für längere Zeit ausgeschaltet wird. Um die Ausfallzeiten zu reduzieren, können Sie den neuen Server in einem anderen Verzeichnis installieren und dann den alten und neuen Server auf unterschiedlichen Ports ausführen. Zum Übertragen der Daten verwenden Sie den Befehl:
pg_dumpall -p 5432 | psql -d postgres -p 5433
Ersetzen Sie 5432 und 5433 durch die Portnummern, auf denen Sie die Server ausgeführt haben.
Um das Entladen und Hochladen von Daten zu vermeiden, verwenden Sie das Programm pg_upgrade. Es hilft Ihnen, schneller zu aktualisieren. Das pg_upgrade-Programm erstellt Systemtabellen neu und berücksichtigt die Änderungen in den neuesten PostgreSQL-Versionen. In diesem Fall werden die alten Datendateien beibehalten. Zusätzlich überprüft pg_upgrade, ob die Cluster kompatibel sind.
Das pg_upgrade-Programm hilft Ihnen, von PostgreSQL 8.4.X auf die aktuelle DBMS-Version zu aktualisieren.
Lassen Sie uns einen allgemeinen Upgrade-Plan mit pg_upgrade durchgehen.
Bewegen Sie den alten Cluster. Dies muss erfolgen, wenn das Verzeichnis nicht mit der alten Version verknüpft war. Zum Beispiel befindet es sich in /usr/local/pgsql. Wenn Sie es nicht umbenennen, tritt ein Konflikt während des Updates auf.
Die Umbenennung erfolgt, wenn der Server ausgeschaltet ist:
mv /usr/local/pgsql /usr/local/pgsql.old
Bauen Sie die neue Version aus dem Quellcode. Passen Sie configure so an, dass die Flags mit der alten Clusterkonfiguration kompatibel sind. Bevor Sie das Upgrade starten, prüft pg_upgrade die Kompatibilität der Flags.
Installieren Sie die neuen ausführbaren Dateien. Um den Server in einem nicht standardmäßigen Verzeichnis zu platzieren, verwenden Sie das Präfix:
make prefix=/usr/local/pgsql.new install
Verwenden Sie initdb, um einen neuen Cluster zu initialisieren. Überprüfen Sie, ob die Flags mit den Flags des alten Clusters kompatibel sind.
Installieren Sie Erweiterungs-Shared-Object-Dateien. Wenn Updates verfügbar sind, erstellt pg_upgrade automatisch ein Skript für deren spätere Installation.
Übertragen Sie die Volltextsuche-Dateien.
Konfigurieren Sie die Peer-Authentifizierung in pg_hba.conf. Dies muss erledigt werden, da pg_upgrade mehrmals eine Verbindung zu den alten und neuen Hosts herstellen wird.
Überprüfen Sie, dass der alte und der neue Server gestoppt sind:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/14 stop
Führen Sie pg_upgrade vom neuen Server aus. Zuerst rufen Sie das Programm im Prüfmodus auf, indem Sie das Flag hinzufügen: pg_upgrade --check. Als Antwort erhalten Sie eine Liste von Anpassungen, die nach dem Upgrade manuell vorgenommen werden müssen.
Wenn Sie Änderungen an der Datei pg_hba.conf vorgenommen haben, stellen Sie diese auf ihren vorherigen Zustand zurück. Manchmal müssen auch andere Konfigurationen im neuen Cluster geändert werden, um mit den Einstellungen des alten Clusters übereinzustimmen.
Starten Sie den Server.
Wenn Sie mit dem Ergebnis zufrieden sind, löschen Sie den alten Cluster.
Für Details und Funktionen zur Verwendung von pg_upgrade siehe die Dokumentation.
Ab Version 10 von PostgreSQL haben wir eine Methode für die logische Replikation von Datenobjekten und Änderungen an ihnen. Sie basiert auf der Verwendung von Replikations-IDs, die normalerweise Primärschlüssel sind.
Logische Replikation verwendet das Publish-Subscribe-Modell. Der Benutzer erstellt einen Snapshot der veröffentlichten Datenbank und kopiert ihn an den Subscriber. In der PostgreSQL-Dokumentation ist ein typisches Szenario für die Verwendung der logischen Replikation genau die Replikation zwischen verschiedenen Hauptversionen von PostgreSQL.
Der Backup-Server kann sich auf demselben oder einem anderen Host befinden. Nach Abschluss der Synchronisierung sind verschiedene Optionen verfügbar. Beispielsweise können Sie den neuen Server zum Hauptserver machen und den alten deaktivieren.
Der Hauptvorteil der logischen Replikation ist die minimale Ausfallzeit. Die Serverunterbrechung ist in einigen Fällen auf wenige Sekunden beschränkt.
Wir haben uns universelle Methoden zum Upgrade von PostgreSQL auf eine neue Hauptversion und zum Update innerhalb einer Hauptversion angesehen.
Mit dieser Anleitung können Sie die Methode auswählen, die am besten für Ihren speziellen Fall geeignet ist, und Ihre aktuelle PostgreSQL-Version aktualisieren.