Mi è capitato di dover schedulare il backup settimanale su un server web LAMP (Linux + Apache + MySQL + PHP), di cui bisognava salvare il contenuto del database ed i file caricati in una directory tramite upload.
Ho pensato subito a cron, un demone (cioè un processo in background) che funge da agenda per mettere in coda dei comandi da eseguire a date ed orari prestabiliti.
Per modificare la lista dei comandi schedulati (detta crontab), c’è appunto il comando
$ crontab -e
Le voci vanno inserite una per riga, nel formato
minuti ore giorno_del_mese mese giorno_della_settimana comando
quindi, ad esempio, per eseguire lo shutdown della macchina ogni giorno all’una di notte, basterà scrivere nel crontab
0 1 * * * shutdown -h now
Torniamo al problema iniziale: archiviare una copia del database e della directory degli upload, una volta alla settimana (domenica a mezzanotte).
Per il database, utilizziamo mysqldump e gzip:
$ mysqldump --opt -uUSER -pPASSWORD DATABASE | \ gzip -9 > /backup/`date -I`_db.sql.gz
l’opzione
--opt
è un alias per tutte queste opzioni:
--add-drop-table --add-locks --create-options --disable-keys \ --extended-insert --lock-tables --quick --set-charset
utili per bloccare momentaneamente lo stato corrente del database e salvarlo integralmente senza metterne in pericolo la coerenza.
Il comando
`date -I`
restituisce una stringa con la data corrente, nel formato AAAA−MM−GG.
Per i file utilizziamo tar e gzip con qualche opzione simpatica:
$ tar cfPpz /backup/`date -I`_uploads.tar.gz /var/www/uploads
dove le opzioni meno conosciute sono:
-P inserisce i percorsi completi dei file nell’archivio (così da ripristinarli nella giusta directory)
-p preserva il proprietario e i permessi dei file archiviati
-z include la compressione con gzip
Mettiamo i comandi appena descritti in un bellissimo script bash (backup.sh):
#!/bin/bash
tar cfPpz …
mysqldump …
chmod 400 /backup/`date -I`_*.gz
e spostiamolo sotto la home dell’utente root (se non lo è già), dando tutti i permessi al solo proprietario (visto che ci sono le password scritte in chiaro):
# mv backup.sh /root # chown root:root /root/backup.sh # chmod 700 /root/backup.sh
(NB: ho utilizzato una shell di root, ma ovviamente su Ubuntu si deve utilizzare sudo per eseguire i comandi come super-user)
Infine modifichiamo il crontab dell’utente root :
# crontab -u root -e
0 0 * * 0 ~/backup.sh > /dev/null 2>&1
Ok, il backup verrà effettuato automaticamente ogni domenica a mezzanotte.
Qualora succedesse qualcosa di grave, per ripristinare un backup basterà eseguire:
# tar xfPpz /backup/DATA_uploads.tar.gz
# gunzip < /backup/DATA_db.sql.gz | mysql -uUSERNAME -pPASSWORD DATABASE
Si fa prima a farlo che a dirlo :)













