Salvare i dati è importante, esattamente come sperare di non dover mai aver bisogno di un backup.
Installando il server mysql, si ottiene anche uno strumento molto potente per eseguire i backup: mysqldump.
Per quanto possa spaventari un po’ l’idea di gestire (e automatizzare) i backup con un tool da riga di comando, ti suggerisco di seguire questo articolo fino in fondo. Scoprirai che in realtà lo strumento è molto lineare e – combinandolo con altri tool (nella migliore tradizione UNIX) – potrai “dimenticare” la questione backup, una volta impostata correttamente.
Ma procediamo con ordine!
1. Generare il dump
mysqldump -u root -pRootPassword --all-databases > MySQL-dump.sql
Proprio così: basta una riga per generare un backup di tutte le tabelle presenti nel database. Ma andiamo a vedere i singoli parametri utilizzati:
-u
: questo parametro indica quale utente deve eseguire il dump del database. Chiaramente, specificando un utente diverso da root, il permesso di poter generare il dump dei dati dipenderà dai permessi in lettura propri dell’utente stesso.-p
: questo parametro indica la password dell’utente. Attenzione, non occorre inserire lo spayio fra “-p” e la password stessa (la stringa sopra non è sbagliata, in sostanza).--all-databases
: questo semplicemente indica che il dump comprenderà tutti i database presenti sul server.
Per convogliare poi l’output SQL del dump in un file, si usa > MySQL-dump.sql
.
Per le istruzioni su come recuperare i dati a partire da un file .sql generato da mysqldump, ti rimando al prossimo articolo. Per il momento, procediamo ad analizzare la situazione, in quanto ciò che manca attualmente è una cosa fondamentale per gli esseri umani: l’automazione!
Fondamentale perchè, se lasciamo noi stessi (o un altro operatore) ad eseguire manualmente un compito talmente importante come il backup, potrà sempre accadere che prima o poi si dimentichi di farlo (magari perchè oberato da mille altri impegni che sembrano apparentemente ben più importanti). Ovviamente il backup cadrà nel dimenticatoio nel momento esatto in cui ci sarà bisogno di averlo (vedi qualcosa sulla Legge di Murphy).
2. Usare cron per automatizzare i backup
Per impostare i backup automatizzati 1 volta al giorno, sarà sufficente creare una nuova riga nel file di configurazione di crontab. Per farlo, dare il comando:
crontab -e
A seconda dell’editor predefinito del sistema, il file verrà aperto di conseguenza. Aggiungere la riga:
15 6 * * * mysqldump -u root -pRootPassword --all-databases > MySQL-dump.sql
Salvare il file e chiudere l’editor. Il sistema ci avviserà dell’avvenuta modifica con questo messaggio:
crontab: installing new crontab
In questo modo, abbiamo specificato di eseguire il dump di tutto il database (eseguendo il medesimo comando che abbiamo eseguito all’inizio di questo turorial) ogni giorno alle 06:15 (per ulteriori informazioni su cron, ti rimando a questo articolo).
3. Qualche miglioramento
Per quanto il sistema a questo punto sia già abbastanza interessante, ci sono dei limiti. Innanzitutto, in questo modo otterremo un unico backup ogni giorno, ma:
- Il file risiede sullo stesso filesystem del sistema (quindi in caso il sistema dovesse essere compromesso, potremmo anche perdere il nostro backup).
- L’output generato ha sempre lo stesso nome (quindi va bene in caso dovessimo ripristinare il backup in seguito ad un incidente di cui ci si accorge subito… Ma supponiamo di avere una corruzione dei dati di qualche giorno fa di cui non ci siamo accorti – il backup che avremo sarà anch’esso corrotto).
- Il dump non è compresso, quindi occuperà molto spazio e avremo meno spazio per conservare il resto dei backup.
Risolviamo entrambi i problemi!
Per prima cosa, anzichè dire a cron di eseguire direttamente il comando mysqldump, creeremo uno script in bash che effettuerà l’operazione. Questo ci permetterà una maggior chiarezza per ulteriori modifiche alle nostre impostazioni di backup senza comunque modificare le imostazioni automatiche di cron.
Secondariamente, indirizzeremo il backup su un’unità esterna al server stesso (l’unità potrà essere sia fisica che virtuale, ciò che importa è che non risieda sullo stesso server).
Infine, comprimeremo l’output in modo da salvare spazio.
Creiamo il file mysql_dump.sh
all’interno della home di root con il nostro editor preferito:
vim /root/mysql_dump.sh
Nel file scriviamo:
#!/bin/sh
mysqldump -u root -pRootPassword --all-databases | gzip > /mnt/backup/mysqldumps/MySQLDB_`date +'%Y-%m-%d--%H:%M'`.sql.gz
find /mnt/backup/mysqldumps/MySQLDB* -mtime +6 -type f -delete
Come si può vedere, abbiamo in sostanza dirottato l’output di mysqldump a gzip per comprimerlo, dopodichè inviato in una directory montata e specificato un nome del file che utilizza una parte variabile rappresentata dalla data di esecuzione (comprensiva di ore e minuti).
L’ultima riga invece dice al sistema di cancellare tutti i file che sono più vecchi di 7 giorni (in modo da cancellare i backup più vecchi in automatico e non doverci preoccupare di ritrovarci col disco pieno).
Una volta creato il file, dobbiamo renderlo eseguibile con:
chmod +x /root/mysql_dump.sh
E infine modificare la nostra crontab:
crontab -e
Sostituire il precedente comando con il nostro nuovo script:
15 6 * * * /root/mysql_dump.sh
In questo modo, avremo un nuovo backup fresco e compresso ogni mattina. In più, il sistema si occuperà di cancellare i file ogni giorno.