Dovendo gestire diversi database su più server ho avuto la necessità di creare uno scripino che automatizzasse la creazione dei loro backup. Riporto quindi lo scrip per intero e successivamente provvederò a spiegare le varie sezioni del codice, anche se a primo acchito tutto dovrebbe apparire piuttosto chiaro.
#!/bin/bash data=$(date +"%d_%b_%y") montaggio=$(mount | grep /media/disk) #File di log FILELOG=/var/log/backup ROOT_UID=0 if [ "$UID" -ne "$ROOT_UID" ];then ERRORE1="Errore 1: Devi essere root per eseguire lo scrip" echo $ERRORE1 echo "$(date) $ERRORE1" >> $FILELOG exit 1 fi if [ ! -n "$montaggio" ]; then mount /media/disk fi if [ ! -d /media/disk/backup/ ]; then cd /media/disk mkdir /media/disk/backup fi cd /media/disk/backup mysqldump nomedatabase -u username -pvostrapassword > database_$data.pl exit 0
Per prima cosa salvo all’interno della variabile “data” l’output del comando date formattato nel seguente modo:
giorno_prime 3 lettere del mese (in inglese)_anno
successivamente definisco all’interno della variabile FILELOG il pathname relativo al file su cui verranno loggati i vari messaggi di errore dello scrip, in questo caso /var/log/backup. Dopodichè mi accerto che lo scrip venga eseguito da root, poichè lo stesso verrà dato in pasto a cron per essere eseguito con tali privilegi.
A questo punto verifico che l’hard disk secondario sia montato, eseguendo il comando:
mount | grep /media/disk
Se tale comando restituisce una stringa vuota eseguo il mount dell’hard disk secondario e successivamente mi posiziono in /media/disk.
Ora devo verificare che la cartalla backup sia presente in /media/disk. Se non lo è provvedo a crearla (in realtà tale operazione verrà effettuata soltanto durante la prima esecuzione dello scrip).
Bene, posso quindi posizionarmi in /media/disk/backup e successivamente effettuare il dump del database mediante il comando mysqldump. Notate che tra la flag -p e la password per accedere al database non vi sono spazi. Inoltre, il dump verrà salvato in un file il cui nome è costituito dalla stringa database_dataattuale.pl, ad esempio:
database_01_Jul_01.pl
Abbiamo quasi finito, non ci resta che creare un binario criptato (RC4) partendo dal nostro scrip, poichè quest’ultimo contiene diverse informazioni critiche, quali, ad esempio, username e password di accesso al database.
Per fare ciò possiamo utilizzare una semplice applicazione, ovvero shc (il sito ufficiale è il seguente: http://www.datsi.fi.upm.es/~frosal/)
Scarichiamo tale applicazione tramite wget:
wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
Scompattiamo la tarball:
tar -xvf shc-3.8.7.tgz
e posizioniamoci nella cartella tar -xvf shc-3.8.7:
cd shc-3.8.7/
Lanciamo il make:
make
Dopodichè facciamo un test per verificare che tale operazione sia andata a buon fine:
make test
Se non ci sono errori dovremmo vedere lo scrip shc presente nella dir shc-3.8.7
Ora trasformiamo il nostro scrip per il backup in eseguibile mediante il comando:
./shc -f /home/nomeutente/database
dove database è il nome del nostro scrip.
Se non ci sono problemi di sorta dovremmo ritrovarci i seguenti 2 file nella nostra home:
database.x e database.x.c
Copiamo ora database.x nella dir /usr/bin/
sudo cp database.x /usr/bin
Infine, mediante cron, scheduliamo l’esecuzione di database.x alle 20 e 30 di ogni sera:
sudo nano /etc/crontab 30 20 * * * root backupdb.x > /dev/null 2>&1
redirigendo lo standard output e lo standard error su /dev/null.
Il nostro scrip per il backup giornaliero dei database è finalmente pronto.
See ya.
PS: ovviamente se abbiamo a che fare con database di grandi dimensioni eseguire un backup giornaliero è sconsigliato, sarebbe meglio eseguire backup settimanali o mensili.
PPS: inutile dire che tale scrip supporta solo MySQL.
Ottimo e interessante post, ho ho trattato e approfondito anche io l’uso di Shc nel mio blog all’indirizzo: http://tonyfire.altervista.org/2010/07/22/trasformare-script-bash-in-eseguibili-con-shc/
In particolare ho parlato della possibilità di specificare un “expiration time” che provvede a rendere non utilizzabile lo script al superamento di una certa data.