CodeGym /Corsi /SQL SELF /Problemi ed errori durante il ripristino dei dati

Problemi ed errori durante il ripristino dei dati

SQL SELF
Livello 44, Lezione 3
Disponibile

Sembra che fare il backup sia come avere un ombrello in una giornata di pioggia: pensi che ti salverà da tutto. Ma se l’ombrello ha un buco, ti bagni lo stesso. Con i backup e il ripristino è la stessa storia: se qualcosa va storto, puoi perdere i dati o, peggio ancora, ritrovarti con un database corrotto. Ecco perché capire gli errori e come evitarli è così importante.

Problemi durante il ripristino dei dati

  1. Incompatibilità tra versioni di PostgreSQL

Uno dei problemi più comuni e fastidiosi è provare a ripristinare dati creati con una versione di PostgreSQL su un’altra (tipo, vuoi ripristinare un backup fatto con la versione 11 sulla 15). PostgreSQL non garantisce la retrocompatibilità tra versioni.

Perché succede?

  • Il formato dei dati può cambiare tra versioni.
  • Alcune funzioni e parametri possono essere rimossi o modificati.

Come evitarlo?

  • Fai sempre i backup usando pg_dump, non copiando direttamente la directory dei dati di PostgreSQL. pg_dump crea script SQL universali che puoi ripristinare su qualsiasi versione compatibile.
  • Controlla la compatibilità delle versioni prima di iniziare il ripristino. Trovi tutto nella documentazione ufficiale di PostgreSQL.

Ecco un esempio. Hai creato un backup con PostgreSQL 14:

pg_dump -U user -d my_database -f backup.sql

Ora provi a ripristinarlo su PostgreSQL 15:

psql -U user -d my_database -f backup.sql

E ti becchi errori tipo:

ERROR:  parametro di configurazione non riconosciuto "old_function"

Soluzione: aggiorna la versione di PostgreSQL sul server oppure usa l’utility pg_upgrade per la migrazione.

  1. Assenza dei file WAL necessari

A volte il ripristino da un backup incrementale o differenziale si interrompe all’improvviso — tutto per colpa dei file WAL (Write-Ahead Logging) mancanti. PostgreSQL si affida a questi file per “completare” le modifiche dopo l’ultimo backup completo. Se mancano o sono corrotti, il database non riesce a finire il ripristino.

Succede, ad esempio, se l’archiviazione dei file WAL non era attiva, oppure qualcuno ha cancellato la cartella per liberare spazio. Quindi, se vuoi usare backup non completi, attiva sempre l’archiviazione in postgresql.conf:

archive_mode = on
archive_command = 'cp %p /path/to/wal_archive/%f'

E ricordati di controllare regolarmente che l’archivio funzioni davvero e che i file siano integri e al loro posto. È un piccolo prezzo per la sicurezza che il ripristino non ti tradirà.

  1. Backup danneggiato

Il tuo file di backup può essere corrotto, rendendolo inutile per il ripristino.

Perché succede?

  • Integrità del file compromessa durante il trasferimento o la conservazione.
  • Crash inaspettato durante la creazione del backup.

Come evitarlo?

Usa la compressione e i checksum per verificare l’integrità del backup. Ad esempio, crea un hash MD5 del file dopo averlo creato:

md5sum backup.sql > backup.sql.md5

Prima di ripristinare i dati, controlla sempre il file di backup:

md5sum -c backup.sql.md5

Problema e soluzione

Provi a ripristinare un file danneggiato:

pg_restore -U user -d my_database backup.dump

E vedi:

pg_restore: errore fatale: il file di input sembra essere un file di testo, ma stai usando lo strumento da linea di comando 'pg_restore'; prova invece con psql

Soluzione: prova ad aprire il file in un editor di testo e controlla se è integro. Se il danno è minimo, puoi provare a sistemare il file SQL a mano.

  1. Permessi utente insufficienti.

A volte durante il ripristino puoi incontrare errori per mancanza di privilegi, soprattutto se provi a ripristinare dati con un utente limitato.

Perché succede?

L’utente non ha abbastanza permessi per creare tabelle, schemi o oggetti nel database.

Come evitarlo?

Esegui il ripristino con un utente che abbia i permessi necessari:

pg_restore -U postgres -d my_database backup.dump
  1. Sovrascrittura di un database esistente

Un altro errore comune è ripristinare un database da backup quando ci sono già dati. Se per sbaglio “sovrascrivi” i dati esistenti, non puoi più recuperarli.

Perché succede?

Non usi il flag --clean, quindi il nuovo backup si aggiunge sopra i vecchi dati.

Come evitarlo?

Quando ripristini, usa il flag --clean per eliminare la struttura esistente:

pg_restore --clean -U user -d my_database backup.dump
  1. Errore di transazione non completata

Durante il ripristino dei dati possono esserci problemi con dati bloccati in una transazione non completata. Questo è particolarmente vero per database grandi.

Perché succede?

La transazione è stata “rovinata” da un crash del server.

Come evitarlo?

Assicurati che il server PostgreSQL completi tutte le transazioni pulite prima di fare i ripristini. Se ci sono problemi, riavvia il server con:

sudo service postgresql restart

Come prevenire gli errori di ripristino

Abbiamo visto come evitare problemi specifici, ma ci sono anche strategie generali che ti aiutano a prevenire la maggior parte degli errori:

Testa regolarmente il ripristino. Crea un database di test separato e prova a ripristinare lì i dati.

Tieni più copie dei backup. Usa un servizio cloud, uno storage locale e un server remoto.

Automatizza la creazione dei backup. Usa cron o strumenti simili per programmare i backup.

Controlla l’integrità dei file. Usa i checksum per essere sicuro che il backup non sia corrotto.

Mantieni sincronizzate le versioni di PostgreSQL. Non rimandare mai gli aggiornamenti di PostgreSQL, perché possono causare problemi di compatibilità in futuro.

Esempi di casi reali e soluzioni

Caso 1: Perdita dei file WAL. Il tuo server si è spento all’improvviso e hai scoperto che mancano i file WAL necessari. In questo caso il ripristino è impossibile senza una copia completa del database. La soluzione più semplice — controlla regolarmente la configurazione dell’archiviazione WAL.

Caso 2: Backup danneggiato. Hai caricato il backup sul server, ma controllando hai visto che il file è vuoto. In questi casi usa una copia di backup da un altro storage o verifica se puoi recuperare qualcosa dalla copia parzialmente danneggiata.

Caso 3: Incompatibilità di versione. Quando hai spostato i dati da PostgreSQL 12 a PostgreSQL 14 hai trovato errori. Trasferisci i dati usando pg_dump e ripristinali con la nuova versione.

2
Compito
SQL SELF, livello 44, lezione 3
Bloccato
Ripristino del database da un backup
Ripristino del database da un backup
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION