Backup fallito con postgres 18

Il database della nostra istanza Discourse non è un contenitore locale; utilizziamo invece un cluster database centralizzato. Recentemente, il PostgreSQL centrale è stato aggiornato alla versione 18.3. Ho notato che il backup di Discourse ora fallisce:

[2026-05-19 03:37:37] [AVVIATO]
[2026-05-19 03:37:37] 'system' ha avviato il backup!
[2026-05-19 03:37:37] Segnalo il backup come in esecuzione...
[2026-05-19 03:37:37] Verifica che '/var/www/discourse/tmp/backups/default/2026-05-19-033737' esista...
[2026-05-19 03:37:37] Verifica che '/var/www/discourse/public/backups/default' esista...
[2026-05-19 03:37:37] Aggiornamento dei metadati...
[2026-05-19 03:37:37] Dump dello schema pubblico del database...
[2026-05-19 03:37:37] pg_dump: errore: interruzione a causa di una discrepanza nella versione del server
[2026-05-19 03:37:37] pg_dump: dettaglio: versione del server: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); versione di pg_dump: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] ECCEZIONE: pg_dump fallito
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'

Hai qualche idea su come risolvere il problema?

Sembra esserci una discrepanza tra le versioni del client e del server PostgreSQL.

Il backup viene eseguito dal container Discourse, dove pg_dump è alla versione 15.15, mentre il server PostgreSQL esterno è alla versione 18.3:

server version: 18.3; pg_dump version: 15.15

Sarei cauto nel modificare il container Discourse a meno che il team di Discourse non lo consigli. Il mio primo istinto sarebbe mantenere il cluster del database esterno allineato alla versione di PostgreSQL che Discourse attualmente si aspetta o supporta.

OK, capito. In questo caso non avevo scelta, poiché avevamo bisogno di 18 per un altro progetto che utilizza lo stesso cluster di database. Hmm, sembra che avremmo bisogno di un server di database separato con 15 risorse esclusivamente per Discourse.

Ci sono commenti dal lato CDCK?

Potrebbe essere possibile aggiornare il client in loco?

Dato che sembri aver dimostrato la compatibilità con PG 18, visto che lo stai utilizzando come database di produzione, ciò sembrerebbe a basso rischio.

Ho eseguito un rapido test preliminare con un Postgres 18 esterno e un’installazione di Discourse fittizia; non ha mostrato alcun problema. Tuttavia, a dire il vero, si è trattato solo di un test “rapido e approssimativo”, non di un test “approfondito”. Comunque, il sistema è in esecuzione da due settimane, quindi presumo che sia tutto a posto. Finora, l’unico problema riguarda il backup interno di Discourse. D’altra parte, il server del database stesso (in esecuzione su LXC) viene backuppato separatamente.

In passato la politica era aggiornare ogni due versioni. Tuttavia, sono passati 1,5 anni dal rilascio di PostgreSQL 17 e l’immagine Docker ufficiale utilizza ancora la versione 15, quindi non sono sicuro che questa sia ancora la prassi.

Ci sono argomenti quasi identici nel passato a cui puoi fare riferimento, ad esempio: Any chance to upgrade the postgres-client version?

Solo un pensiero: puoi eseguire il dump direttamente dalla riga di comando dal server PostgreSQL?

Puoi aggiungere del codice al tuo app.yml per aggiornare PostgreSQL alla versione corrispondente. L’ho già fatto in passato, ma non riesco a trovare le mie note. La cosa più semplice da fare è entrare nel container, eseguire i comandi apt per installare i client PostgreSQL corretti e poi provare il backup. Una volta che funziona, aggiungi quei comandi ai comandi exec nel tuo app.yml, in modo che funzioni anche dopo il prossimo rebuild.

Se hai bisogno di qualcuno che ti guidi, puoi scrivermi via email o pubblicare un messaggio in Marketplace.

Hmm, è stato abbastanza semplice:

  1. ./launcher enter web_only
  2. sudo apt-get install postgresql

Questo aggiorna il pacchetto postgres alla versione 18.
Poi avvia il backup dall’interfaccia di amministrazione, che sembra andare a buon fine.

[2026-05-21 16:26:50] 'admin' ha avviato il backup!
[2026-05-21 16:26:50] Segnalo il backup come in esecuzione...
[2026-05-21 16:26:50] Verifica che '/var/www/discourse/tmp/backups/default/2026-05-21-162650' esista...
[2026-05-21 16:26:50] Verifica che '/var/www/discourse/public/backups/default' esista...
[2026-05-21 16:26:50] Aggiornamento dei metadati...
[2026-05-21 16:26:50] Dump dello schema pubblico del database...
[2026-05-21 16:26:50] pg_dump: esecuzione SELECT pg_catalog.set_config('search_path', '', false);
[2026-05-21 16:26:50] pg_dump: ultimo OID incorporato è 16383
[2026-05-21 16:26:50] pg_dump: lettura delle estensioni
[2026-05-21 16:26:50] pg_dump: identificazione dei membri dell'estensione
[2026-05-21 16:26:50] pg_dump: lettura degli schemi
[2026-05-21 16:26:50] pg_dump: lettura delle tabelle definite dall'utente
[2026-05-21 16:26:50] pg_dump: lettura delle funzioni definite dall'utente
[2026-05-21 16:26:50] pg_dump: lettura dei tipi definiti dall'utente
[2026-05-21 16:26:50] pg_dump: lettura dei linguaggi procedurali
[2026-05-21 16:26:50] pg_dump: lettura delle funzioni aggregate definite dall'utente
[2026-05-21 16:26:50] pg_dump: lettura degli operatori definiti dall'utente
[2026-05-21 16:26:50] pg_dump: lettura dei metodi di accesso definiti dall'utente
[2026-05-21 16:26:50] pg_dump: lettura delle classi di operatori definiti dall'utente
[2026-05-21 16:26:50] pg_dump: lettura delle famiglie di operatori definiti dall'utente
[... .... ...]
[2026-05-21 16:26:57] Finalizzazione del backup...
[2026-05-21 16:26:57] Creazione dell'archivio: netzwissen-forum-2026-05-21-162650-v20260520064255.tar.gz
[2026-05-21 16:26:57] Verifica che l'archivio non esista già...
[2026-05-21 16:26:57] Creazione di un archivio vuoto...
[2026-05-21 16:26:57] Archiviazione del dump dei dati...
[2026-05-21 16:26:57] Archiviazione dei file caricati...
[2026-05-21 16:26:58] Rimozione della directory temporanea '/var/www/discourse/tmp/backups/default/2026-05-21-162650'...
[2026-05-21 16:26:58] Compressione dell'archivio con gzip, potrebbe richiedere del tempo...

Bene! Probabilmente cercherei di installare specificamente i componenti del client pg18, in modo che non passi alla versione 19 in un secondo momento. Inoltre, dovrai aggiungere questi comandi al tuo app.yml, a meno che tu non voglia eseguirli manualmente a ogni aggiornamento.