PostgreSQL 13 Update

:warning: WARNUNG! Wenn Ihre Datenbank sehr groß ist, benötigen Sie viel zusätzlichen Festplattenspeicher (das 2-fache der Datenbankgröße) und sollten bei diesem Upgrade äußerst vorsichtig sein!

Wir haben gerade Änderungen eingeführt, um unser Docker-Image auf PostgreSQL 13 zu aktualisieren. Alle Site-Administratoren, die Discourse über die Befehlszeile neu aufbauen, werden von der vorherigen PostgreSQL 12 auf PostgreSQL 13 aktualisiert. Beachten Sie, dass, wenn Sie das Update auf PostgreSQL 12 im Mai nicht durchgeführt haben, Sie dieses Update überspringen und direkt zu PostgreSQL 13 wechseln können.

Wenn Sie das Update zuvor zurückgestellt haben, ändern Sie die PostgreSQL-Vorlage in app.yml von templates/postgres.10.template.yml zu templates/postgres.template.yml.

Wie bei jedem Upgrade wird dringend empfohlen, vor jeglichen Aktionen ein Backup zu erstellen.

Aktualisieren

Offizieller Installationsleitfaden (Single Container)

Beim nächsten Neuaufbau werden Sie am Ende folgende Meldung sehen:

-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 12 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------

Das bedeutet, dass das Upgrade erfolgreich verlaufen ist! Sie müssen nur einen neuen Neuaufbau durchführen, um Ihre Site wieder zum Laufen zu bringen.

Installation mit Daten-Container

Wenn Sie eine Einrichtung mit einem dedizierten Daten-Container verwenden, der auf dem in unserem discourse_docker-Repository bereitgestellten Beispiel basiert, müssen Sie sicherstellen, dass PostgreSQL sicher und sauber heruntergefahren wird.

Heutzutage laufen im Hintergrund Jobs, die Abfragen ausführen, die mehrere Minuten dauern. Das Herunterfahren des Web-Containers hilft daher, den Daten-Container sicher herunterzufahren.

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

Bevor Sie den ersten Neuaufbau für den Daten-Container ausführen, können Sie das PostgreSQL-Log mit tail überprüfen, um zu sehen, ob es ordnungsgemäß heruntergefahren wurde.

Das Ausführen von tail -f shared/data/log/var-log/postgres/current sollte bei einem sauberen Herunterfahren folgende Logausgabe liefern:

2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

Manuelles Update / Umgebungen mit begrenztem Speicherplatz

:warning::warning::warning:
SIE MÜSSEN VOR DEM VERSUCH DIESER METHODE EIN BACKUP DER POSTGRES_DATA ERSTELLEN
:warning::warning::warning:

Wenn Sie sich in einer Umgebung mit begrenztem Speicherplatz befinden und keinen Weg haben, mehr Speicherplatz zu erhalten, können Sie Folgendes versuchen:

./launcher stop app #(oder sowohl web_only als auch data, falls dies auf Sie zutrifft)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/12/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/13/data \
	tianon/postgres-upgrade:12-to-13
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
./launcher rebuild app #(oder zuerst data und dann web_only, falls dies auf Sie zutrifft)

Bei meinen Tests benötigt dieses Verfahren weniger als das 1-fache Ihrer aktuellen Datenbankgröße an freiem Speicherplatz.

Verschieben des Updates

Wenn Sie das Update beim nächsten Neuaufbau verschieben müssen, können Sie die PostgreSQL-Vorlage in Ihrer app.yml-Datei ändern, indem Sie "templates/postgres.template.yml" in "templates/postgres.12.template.yml" ändern.

Dies wird nicht empfohlen, da einige Site-Administratoren vergessen, die Änderung anschließend rückgängig zu machen.

Optionale Aufgaben nach dem Update

Optimierung der PostgreSQL-Statistiken

Nach dem Update verfügt das neue PostgreSQL nicht über Tabellenstatistiken. Sie können diese mit folgenden Befehlen generieren:

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
VACUUM VERBOSE ANALYZE;
\q
exit
exit

Oder diese Einzeiler-Version davon:

/var/discourse/launcher run app "echo 'vacuum verbose analyze;' | su postgres -c 'psql discourse'"

Neu erstellen der Indizes

Das Hauptmerkmal dieses Upgrades ist eine erhebliche Speichereinsparung in unserer größten Tabelle in jeder Instanz, der post_timings-Tabelle und ihren Indizes. Nach einem erfolgreichen Update müssen Sie einen Befehl ausführen, um die Indizes neu zu erstellen und die Vorteile zu nutzen.

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
REINDEX SCHEMA CONCURRENTLY public;
\q
exit
exit

Wenn Sie die Größe von post_timings vor und nach dem REINDEX überprüfen können, wäre das eine coole Statistik, die Sie hier teilen können!

Sie können die folgende Abfrage verwenden, um die 20 größten Datenobjekte zu überprüfen. Führen Sie sie vor und nach dem Reindex aus:

WITH RECURSIVE pg_inherit(inhrelid, inhparent) AS
    (select inhrelid, inhparent
    FROM pg_inherits
    UNION
    SELECT child.inhrelid, parent.inhparent
    FROM pg_inherit child, pg_inherits parent
    WHERE child.inhparent = parent.inhrelid),
pg_inherit_short AS (SELECT * FROM pg_inherit WHERE inhparent NOT IN (SELECT inhrelid FROM pg_inherit))
SELECT table_schema
    , TABLE_NAME
    , row_estimate
    , pg_size_pretty(total_bytes) AS total
    , pg_size_pretty(index_bytes) AS INDEX
    , pg_size_pretty(toast_bytes) AS toast
    , pg_size_pretty(table_bytes) AS TABLE
  FROM (
    SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes
    FROM (
         SELECT c.oid
              , nspname AS table_schema
              , relname AS TABLE_NAME
              , SUM(c.reltuples) OVER (partition BY parent) AS row_estimate
              , SUM(pg_total_relation_size(c.oid)) OVER (partition BY parent) AS total_bytes
              , SUM(pg_indexes_size(c.oid)) OVER (partition BY parent) AS index_bytes
              , SUM(pg_total_relation_size(reltoastrelid)) OVER (partition BY parent) AS toast_bytes
              , parent
          FROM (
                SELECT pg_class.oid
                    , reltuples
                    , relname
                    , relnamespace
                    , pg_class.reltoastrelid
                    , COALESCE(inhparent, pg_class.oid) parent
                FROM pg_class
                    LEFT JOIN pg_inherit_short ON inhrelid = oid
                WHERE relkind IN ('r', 'p')
             ) c
             LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
  ) a
  WHERE oid = parent
) a
ORDER BY total_bytes DESC LIMIT 20;

Bereinigen alter Daten

Für eine Standardinstallation können Sie die alten Daten im PG12-Format mit dem folgenden Befehl löschen:

cd /var/discourse
./launcher cleanup

Wenn Sie einen separaten Daten-Container verwenden, müssen Sie die Sicherungskopie wie folgt entfernen:

rm -fr /var/discourse/shared/data/postgres_data_old/

FAQ

Der Quellcluster wurde nicht sauber heruntergefahren

Wenn Sie ein Upgrade-Fehler mit der oben genannten Meldung erhalten, können Sie einen einfacheren Ansatz versuchen, um ihn wieder in einen besseren Zustand zu versetzen.

Starten Sie den alten Container mit ./launcher start app. Warten Sie einige Minuten, bis er wieder online ist.

Fahren Sie ihn nun erneut mit ./launcher stop app herunter. Überprüfen Sie danach die Logs, um zu sehen, ob es ein sauberes Herunterfahren war:

tail -f shared/data/log/var-log/postgres/current
2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

Wenn die Logs wie oben aussehen, können Sie nun versuchen, das Upgrade erneut mit ./launcher rebuild app durchzuführen.

lc_collate-Werte für Datenbank “postgres” stimmen nicht überein

Dieser Fehler tritt auf, wenn Sie nicht-standardmäßige Locales für Ihre Datenbank verwenden. Es wurde berichtet, dass 3 Variablen erforderlich sind, damit dies erfolgreich ist. Stellen Sie sicher, dass der env:-Abschnitt Ihrer app.yml-Datei die folgenden 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 lokales Setting.

Jeder Neuaufbau führt das Upgrade erneut durch (Upgrade-Schleife)

Wenn dies geschieht, enthalten Ihre Upgrade-Logs Folgendes:

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

Dies bedeutet, dass noch Dateien vom letzten Upgrade vorhanden sind. Verschieben Sie diese vor dem Weitermachen an einen anderen Ort.

Vorschläge für Skripte nach Abschluss des Upgrades – Muss ich etwas tun?

Sobald das Upgrade abgeschlossen ist, sehen Sie eine Ausgabe der pg_upgrade-Meldung wie folgt:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

Sie können diese Meldung sicher ignorieren.

Ich habe das PostgreSQL 12-Update übersprungen, was nun?

Sie können die Standardanweisungen am Anfang dieses Leitfadens befolgen; sie aktualisieren Ihre Version ohne Probleme auf 13.

Wenn Sie die Anweisungen für Umgebungen mit begrenztem Speicherplatz befolgen, passen Sie die Versionsnummern entsprechend an.

38 „Gefällt mir“
PostgreSQL Details
Discourse 2.7.0.beta2 Release Notes
Forum offline due to failed rebuilds on Tests-Pass
Nginx upstream timed out (110: Connection timed out)
Firewall issue with running multiple containers after upgrade
Help! Problem with firewall/permissions and postgre?
PostgreSQL 13 update from PostgreSQL 10 fails
PostgreSQL 13 update from PostgreSQL 10 fails
Unrecognized error type (ActiveRecord::StatementInvalid: PG::ProgramLimitExceeded
Recover from filesystem backup: can't rebuild nor start
Rebuild error: Errno::ENOENT: No such file or directory @ rb_sysopen - /e tc/postgresql/13/main/pg_hba.conf
Discourse broken after upgrade
Upgrade Failed from 2.7.0.beta1 to 2.7.0.beta3
Invalid location error after update
Upgrade failed!
Upgrade failed: PostgreSQL version 13 ... not compatible with ... version 10.12
Improved Bookmarks with Reminders
Importing old database to latest version
Errors encountered when uploading images
What else do I need to take care of when self hosting?
Rebuild freezing when attempting to stop container
Backup failed due to PG/SQL errors
Restore Failing - Check Free Disk Space
Supported postgresql versions
Wrong Error Message for too short replies for Reply-by-Email
Upgrade Postgres with REALLY limited space
Upgrade Postgres with REALLY limited space
Postgres has 100% CPU for large databases, Discourse 2.7.7
Upgrade failing with FAILED TO BOOTSTRAP
Stuck in an update loop after PostgreSQL 13 update
Problem with rebuild Discourse at Docker
After Rebuild got error: postgres:10/main, Causes CPU to go high
Call AdminDashboardGeneralData.refresh_stats at boot?
ERROR: You are running an old version of the Discourse image
Failed to upgrade to v2.9.0beta3
Failed to upgrade to v2.9.0beta3
SMTP Settings in app.yml reset?
Upgrade container - keeping config and data
Site down after failed update: permission denied to create extension "unaccent"
Rebuild fails on db:migrate w/PG12
Update from 2.9.0 beta2 to beta4 failed (my site is down)
Performance optimisation tips
Upgrading from 2.4 to 2.9. Need slight assistance on what order to run the final commands & reboot in
Problem when updating Discourse Forum
Troubleshooting severe performance issues with latest Discourse?
Slow Profile Loads with 100GB+ database
Use Nginx Proxy Manager to manage multiple sites with Discourse
Horizontal loading slider
Upgrading Discourse from 2.6.0.beta2
PostgreSQL 15 update
Got a lot of "Failed to backfill 'Reader' badge" errors
Trouble updating discourse after some time - UPGRADE OF POSTGRES FAILED
Database size/maintenance
Upgrade gone sideways [deprecated Guest Gate plugin]
Upgrade Issues: Failed Upgrade due to Duplicate Key, Failed Snapshot Restore
2.7.0.beta2 upgrade failed with ERROR: duplicate key
Problem, rebuild to latest version
Urgent, upgraded build failed UniqueViolation