WARNUNG! Wenn Ihre Datenbank sehr groß ist, benötigen Sie viel zusätzlichen Speicherplatz (das Doppelte der Datenbankgröße) und sollten bei diesem Upgrade sehr vorsichtig sein!
Wir haben gerade Änderungen vorgenommen, um unser Docker-Image auf PostgreSQL 15 zu aktualisieren. Alle Site-Administratoren, die Discourse von der Befehlszeile aus neu erstellen, werden von der vorherigen PostgreSQL 13-Version auf PostgreSQL 15 aktualisiert. Beachten Sie, dass Sie, wenn Sie das Upgrade übersprungen haben, als das PostgreSQL 13-Update im Jahr 2020 stattfand, dieses Upgrade überspringen und direkt zu PostgreSQL 15 wechseln können.
Wenn Sie das Upgrade zuvor zurückgehalten haben, ändern Sie die PostgreSQL-Vorlage in app.yml von templates/postgres.12.template.yml zu templates/postgres.template.yml.
Wie bei jedem Upgrade wird dringend empfohlen, vor Beginn eine Sicherung zu erstellen.
Aktualisieren
Offizielle Installationsanleitung (Einzelcontainer)
Bei Ihrer nächsten Neuerstellung sehen Sie am Ende diese Meldung:
-------------------------------------------------------------------------------------
UPGRADE VON POSTGRES ABGESCHLOSSEN
Alte 13-Datenbank wird unter /shared/postgres_data_old gespeichert
Um das Upgrade abzuschließen, erstellen Sie erneut mit:
./launcher rebuild app
-------------------------------------------------------------------------------------
Das bedeutet, dass alles beim Upgrade gut verlaufen ist! Sie müssen nur eine neue Neuerstellung ausführen, um Ihre Website wieder zum Laufen zu bringen.
Installation mit Datencontainer
Wenn Sie eine Einrichtung mit einem dedizierten Datencontainer verwenden, der auf dem Muster in unserem Discourse_docker-Repository basiert, sollten Sie sicherstellen, dass Sie PostgreSQL auf sichere und saubere Weise herunterfahren.
Heutzutage laufen Hintergrundaufträge, die Abfragen über mehrere Minuten ausführen. Das Herunterfahren des Webcontainers hilft dem Datencontainer, sicher heruntergefahren zu werden.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
Bevor Sie die erste Neuerstellung für den Datencontainer ausführen, können Sie das PostgreSQL-Protokoll verfolgen, um zu sehen, ob es ordnungsgemäß heruntergefahren wurde.
Wenn Sie tail -f shared/standalone/log/var-log/postgres/current ausführen, sollten Sie das folgende Protokoll erhalten, wenn es sauber war:
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
Manuelles Update / Umgebungen mit begrenztem Speicherplatz
SIE MÜSSEN POSTGRES_DATA SICHERN, BEVOR SIE DIES VERSUCHEN
Wenn Sie sich in einer Umgebung mit begrenztem Speicherplatz befinden, ohne die Möglichkeit, mehr Speicherplatz zu erhalten, können Sie Folgendes versuchen:
./launcher stop app #(oder beide web_only und data, falls zutreffend)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
--entrypoint=/bin/bash \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade"
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
docker run --rm -v /var/discourse/shared/standalone:/shared local_discourse/app \
chown -R postgres:postgres /shared/postgres_data #(oder local_discourse/data)
./launcher rebuild app #(oder zuerst data und dann web_only, falls zutreffend)
Bei meinen Tests benötigt dieses Verfahren weniger als das 1-fache Ihres aktuellen Datenbankgrößen-Speicherplatzes.
Wenn Sie ein nicht standardmäßiges Gebietsschema verwenden, können Sie den ersten docker-Befehl wie folgt ersetzen:
# 'en_US.UTF-8' durch Ihr Gebietsschema ersetzen
docker run --rm \
--entrypoint=/bin/bash \
-e LANG='en_US.UTF-8' \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade'
Verschieben des Updates
Wenn Sie das Update bei Ihrer nächsten Neuerstellung verschieben müssen, können Sie die PostgreSQL-Vorlage in Ihrer app.yml-Datei austauschen, indem Sie "templates/postgres.template.yml" durch "templates/postgres.13.template.yml" ersetzen.
Dies wird nicht empfohlen, da einige Site-Administratoren vergessen, die Änderung später rückgängig zu machen.
Optionale Aufgaben nach dem Update
Optimieren von PostgreSQL-Statistiken
Nach dem Update hat die neue PostgreSQL-Version keine Tabellenstatistiken zur Hand. Sie können diese mit folgendem Befehl generieren:
docker exec -u postgres app \
/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages
Bereinigen alter Daten
Für eine Standardinstallation können Sie die alten Daten im PG13-Format mit folgendem Befehl löschen:
cd /var/discourse
./launcher cleanup
Wenn Sie einen separaten Datencontainer haben, müssen Sie die Sicherungskopie wie folgt löschen:
rm -fr /var/discourse/shared/data/postgres_data_old/
FAQ
Der Quellcluster wurde nicht sauber heruntergefahren
Wenn Sie eine Fehlermeldung wie die obige beim Upgrade erhalten, können Sie einen einfacheren Ansatz versuchen, um ihn wieder in einen besseren Zustand zu bringen.
Starten Sie den alten Container mit ./launcher start app neu. Warten Sie ein paar Minuten, bis er wieder hochgefahren ist.
Fahren Sie ihn nun erneut mit ./launcher stop app herunter. Anschließend können Sie die Protokolle verfolgen, um zu sehen, ob es ein sauberer Vorgang war:
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
Wenn die Protokolle nicht darauf hinweisen, dass die Datenbank heruntergefahren ist, können Sie den alten Container erneut starten, mit ./launcher enter app eintreten, die folgenden Befehle ausführen und die Protokolle danach erneut verfolgen.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
Wenn die Protokolle wie oben aussehen, können Sie nun versuchen, das Upgrade erneut mit ./launcher rebuild app durchzuführen.
lc_collate-Werte für die Datenbank „postgres“ stimmen nicht überein
Dieser Fehler tritt auf, wenn Sie nicht standardmäßige Gebietsschemata für Ihre Datenbank verwenden. Es wurde berichtet, dass Sie 3 Variablen benötigen, damit dies erfolgreich ist. Stellen Sie sicher, dass der Abschnitt env: Ihrer app.yml-Datei die 3 Zeilen enthält:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
Ersetzen Sie en_US.UTF-8 durch Ihr Gebietsschema.
Jede Neuerstellung führt erneut das Upgrade durch (Upgrade-Schleife)
Wenn dies geschieht, enthalten Ihre Upgrade-Protokolle:
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty
Das bedeutet, dass noch Dateien vom letzten Upgrade herumliegen. Verschieben Sie diese woandershin, bevor Sie fortfahren.
Skripte für die Upgrade-Vervollständigung – muss ich etwas tun?
Sobald das Upgrade abgeschlossen ist, sehen Sie die Ausgabe der Meldung pg_upgrade:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
Diese Meldung können Sie getrost ignorieren.
Ich habe das PostgreSQL 13-Update übersprungen, was nun?
Sie können den Standardanweisungen am Anfang dieser Anleitung folgen, und sie werden von Ihrer Version auf 15 ohne Probleme aktualisiert.
Wenn Sie den Anweisungen für Umgebungen mit begrenztem Speicherplatz folgen, passen Sie die Versionsnummern entsprechend an.
Das Neuerstellen von Indizes kann Ihnen erhebliche Speicherplatzersparnis bringen. Befolgen Sie die Schritte aus unserem PostgreSQL 13-Update nach dem Upgrade.