Come eseguire il backup e il ripristino dei database utilizzando pg_dump e pg_restore
Padroneggia la protezione dei dati PostgreSQL con questa guida completa a `pg_dump` e `pg_restore`. Scopri come creare backup affidabili del database utilizzando vari formati, inclusi testo semplice, personalizzato e directory. Scopri opzioni essenziali per il dumping efficiente ed esplora istruzioni passo passo per ripristinare i tuoi dati. Questo tutorial copre le migliori pratiche per la pianificazione, il test e la gestione sicura dei tuoi backup PostgreSQL per garantire l'integrità dei dati e le capacità di ripristino.
Come eseguire il backup e il ripristino dei database utilizzando pg_dump e pg_restore
Hai bisogno di un backup PostgreSQL che puoi ripristinare, non solo di un file che sembra un backup. pg_dump e pg_restore sono gli strumenti standard per i backup logici: copiano gli oggetti del database e i dati in un dump portatile, quindi li ricostruiscono successivamente sullo stesso server, su un server di test o su una nuova istanza PostgreSQL.
Questa guida si concentra sui backup logici di singoli database. Per il disaster recovery dell'intero cluster, il ripristino point-in-time o installazioni molto grandi, abbina questo a backup fisici e archiviazione WAL.
Comprendere pg_dump
pg_dump si connette a un database ed esporta il suo schema e i dati. Non esegue il dump di ruoli, tablespace o oggetti globali del cluster; usa pg_dumpall --globals-only quando ne hai bisogno.
Formati di output
pg_dump supporta più formati di output:
- Testo semplice (
-Fp, predefinito): Scrive SQL che ripristini conpsql. È facile da ispezionare e modificare, ma i ripristini di grandi dimensioni possono essere più lenti e meno flessibili. - Archivio personalizzato (
-Fc): Scrive un archivio compresso perpg_restore. Supporta il ripristino selettivo e il ripristino parallelo. - Formato directory (
-Fd): Scrive una directory di file. Supporta il dump parallelo e il ripristino parallelo, il che aiuta per database di grandi dimensioni. - Formato tar (
-Ft): Scrive un archivio tar perpg_restore. È un singolo file, ma non supporta la compressione all'interno del formato come fanno gli archivi personalizzati.
Opzioni comuni di pg_dump
Ecco alcune delle opzioni più frequentemente utilizzate per pg_dump:
-h <hostname>: Connetti a un host.-p <port>: Connetti a una porta.-U <username>: Connetti come utente.-W: Forza una richiesta di password prima di connettersi.-f <filename>: Scrivi su un file o directory invece dell'output standard.-F <format>: Sceglip,c,dot.-Z <level>: Imposta il livello di compressione per i formati che supportano la compressione.--exclude-table=<pattern>: Escludi tabelle corrispondenti.-j <number>o--jobs=<number>: Usa lavori paralleli durante il dump in formato directory.--clean: Includi comandi di drop prima dei comandi di create nell'output SQL semplice.--create: Includi comandi per creare il database stesso.
Esempio: Backup di base in testo semplice
Per creare un backup in testo semplice di un database chiamato mydatabase di proprietà dell'utente myuser e salvarlo in mydatabase_backup.sql:
pg_dump -U myuser -f mydatabase_backup.sql mydatabase
Se devi specificare un host e una porta:
pg_dump -h localhost -p 5432 -U myuser -f mydatabase_backup.sql mydatabase
A seconda del tuo metodo di autenticazione, potrebbe essere richiesta la password di myuser.
Esempio: Backup in formato personalizzato (consigliato)
Il formato personalizzato è una buona impostazione predefinita per molti backup di produzione perché funziona con pg_restore e supporta il ripristino selettivo.
pg_dump -U myuser -Fc -f mydatabase_backup.dump mydatabase
Questo crea mydatabase_backup.dump in un formato adatto per pg_restore.
Esempio: Backup in formato directory con lavori paralleli
Per database di grandi dimensioni, il dump parallelo può ridurre il tempo di backup. Richiede il formato directory:
pg_dump -U myuser -Fd -j 4 -f mydatabase_backup_dir mydatabase
Questo comando creerà una directory chiamata mydatabase_backup_dir contenente più file, utilizzando 4 lavori paralleli.
Comprendere pg_restore
pg_restore ripristina archivi personalizzati, directory o tar creati da pg_dump. I file SQL semplici vengono ripristinati con psql, non con pg_restore.
Opzioni comuni di pg_restore
-h <hostname>: Connetti a un host.-p <port>: Connetti a una porta.-U <username>: Connetti come utente.-W: Forza una richiesta di password prima di connettersi.-d <database>: Connetti a questo database per il ripristino.-v: Stampa output di ripristino dettagliato.-co--clean: Elimina gli oggetti del database prima di ricrearli.--create: Crea il database di cui è stato eseguito il dump prima di ripristinarlo. Connettiti con-da un database di manutenzione esistente, comunementepostgres.-j <number>: Usa lavori paralleli per il ripristino dove supportato.-F <format>: Specifica il formato dell'archivio se il rilevamento automatico non è sufficiente.
Ripristino da backup SQL in testo semplice
Se hai creato un backup SQL in testo semplice usando pg_dump (ad esempio, mydatabase_backup.sql), lo ripristini usando psql:
psql -U myuser -d mydatabase -f mydatabase_backup.sql
Se il file di backup include comandi CREATE DATABASE e \connect da pg_dump --create, connettiti a un database di manutenzione come postgres:
psql -U myuser -f mydatabase_backup.sql postgres
Esempio: Ripristino da un backup in formato personalizzato
Per ripristinare il backup in formato personalizzato mydatabase_backup.dump in un database chiamato restored_db:
pg_restore -U myuser -d restored_db mydatabase_backup.dump
Se l'archivio è stato creato con pg_dump --create, puoi chiedere a pg_restore di creare il database di cui è stato eseguito il dump. Il valore di -d deve essere un database esistente utilizzato per la connessione iniziale, non il nuovo database che viene creato:
pg_restore -U myuser --create -d postgres mydatabase_backup.dump
Questo crea il database con il nome specificato all'interno del dump e lo ripristina. Se vuoi ripristinare in un database con un nome diverso, crea prima quel database e ripristina senza --create:
createdb -U myuser restored_db
pg_restore -U myuser -d restored_db mydatabase_backup.dump
Esempio: Ripristino parallelo
Per un ripristino più veloce, specialmente con set di dati di grandi dimensioni, usa l'opzione -j:
pg_restore -U myuser -d restored_db -j 4 mydatabase_backup.dump
Questo ripristina con 4 lavori worker. Il ripristino parallelo è più utile quando il dump ha più oggetti indipendenti da caricare e indicizzare.
Esempio: Ripristino da un backup in formato directory
Per ripristinare un backup creato in formato directory (ad esempio, mydatabase_backup_dir):
pg_restore -U myuser -d restored_db -j 4 mydatabase_backup_dir
Nota che l'ultimo argomento è il percorso della directory.
Migliori pratiche per i backup
- Pianifica i backup: Usa
cron, timer systemd o la tua piattaforma di orchestrazione. Scegli una pianificazione in base alla quantità di dati che puoi permetterti di perdere. - Usa il formato giusto: Il formato personalizzato è una buona impostazione predefinita. Il formato directory è migliore quando hai bisogno di un dump parallelo per un database di grandi dimensioni.
- Testa i ripristini: Ripristina su un database di staging secondo una pianificazione. Un backup che non testi mai è solo un'ipotesi.
- Cattura gli oggetti globali: Esegui il dump di ruoli e tablespace separatamente con
pg_dumpall --globals-onlyquando ricostruisci un server da zero. - Conserva copie fuori sede: Tieni i backup lontani dal server primario e proteggili con crittografia e controlli di accesso.
- Monitora i lavori: Avvisa in caso di dump falliti, file di backup insolitamente piccoli e timestamp di backup vecchi.
- Pianifica la conservazione: Decidi quanti backup orari, giornalieri, settimanali e mensili conservare, quindi automatizza la pulizia.
- Fai attenzione con
--clean: Elimina gli oggetti nel database di destinazione. Usalo solo quando intendi sostituire oggetti esistenti.
Conclusione
Usa pg_dump -Fc per un backup flessibile di un singolo file, pg_dump -Fd -j quando hai bisogno di dump parallelo, psql per ripristini SQL semplici e pg_restore per ripristini di archivi. Quindi dimostra il processo ripristinando su un database di test prima di averne bisogno in un'emergenza.