Backup di MySQL tramite script
Introduzione
Attraverso lo script riportato di seguito è possibile effettuare il backup di tutti i database presenti nella nostra installazione di MySQL. Lo script (basato sull'originale presente su: http://bash.cyberciti.biz/) permette la personalizzazione attraverso i parametri:
MyUSER="utente_MySQL" # USERNAME
MyPASS="Password_Utente # PASSWORD
MyHOST="localhost" # Hostname
che vanno compilati con i dati per accedere al nostro server MySQL, e:
DEST="/backup"
IGGY="test"
La variabile DEST permette di impostare la directory di destinazione del backup. I database saranno salvati all'interno di una sottodirectory chiamata mysql.
La variabile IGGY permette di indicare quali database devono essere esclusi dal processo di backup.
Lo script
#!/bin/bash
# Shell script to backup MySql database
# To backup Mysql databases file to /backup dir and later pick up by your
# script. You can skip few databases from backup too.
# -------------------------------------------------------------------------
MyUSER="utente_MySQL" # USERNAME
MyPASS="Password_Utente # PASSWORD
MyHOST="localhost" # Hostname
# Linux bin paths, change this if it can't be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
# Backup Dest directory, change this if you have someother location
DEST="/backup"
# Main directory where backup will be stored
MBD="$DEST/mysql"
# Get hostname
HOST="$(hostname)"
# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"
# File to store current backup file
FILE=""
# Store list of databases
DBS=""
# DO NOT BACKUP these databases
IGGY="test"
[ ! -d $MBD ] && mkdir -p $MBD || :
# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
# Get all database list first
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
for db in $DBS
do
skipdb=-1
if [ "$IGGY" != "" ];
then
for i in $IGGY
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$db.$HOST.$NOW.gz"
# do all inone job in pipe,
# connect to mysql using mysqldump for select mysql database
# and pipe it out to gz file in backup dir :)
$MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
fi
done
Per non intasare il server e eliminare i backup vecchi è possibile mettere in crontab uno script simile al seguente, che cancella i file di backup più vecchi di sette giorni:
find /backup/mysql -type f -mtime +7 -exec rm {} \;
Esecuzione automatica dello script
L'inserimento di questo script in una voce del vostro crontab (si veda ad esempio la guida su Cron) permette un backup automatizzato dei database di MySQL senza la necessità di interrompere il servizio.
Uno script alternativo
#!/bin/bash
FILE=/dove/voglio/backuppare/name_backup
NAME=utente_sql
PASS=password_sql
DB=nome_DB
echo "Content-type: text/plain"
echo
echo "Tried to export file: "$FILE
#eliminare il commmento a seconda del risultato che si vuole ottenere
#dump non compresso
#mysqldump --quote-names -u $NAME --password=$PASS $DB > $FILE.sql
#dump compresso con gzip
#mysqldump --quote-names -u $NAME --password=$PASS $DB| gzip -9 > $FILE.sql.gz
Lo script permette il backup del database specificato nella variabile DB.
L'inserimento di questo script in una voce del vostro crontab (si veda ad esempio la guida su Cron) permette un backup automatizzato dei database di MySQL senza la necessità di interrompere il servizio.
Un terzo script
Lo script seguente effettua il backup di tutti i database presenti sul server e imposta una rotazione che conserva gli ultimi 4 backup salvati.
#!/bin/bash
#Simple mySQL backup script for cron – updated version
# Modify the following to suit your environment
export DB_BACKUP=”/home/user/mysql_backup”
export DB_USER=”root”
export DB_PASSWD=”***********”
export DATE=”`date +”%d%b”`”
export MYSQL=”/usr/bin/mysql”
export MYSQLDUMP=”/usr/bin/mysqldump”
# Backup part
echo “mySQL_backup”
echo “———————-”
echo “* Rotating backups…”
rm -rf $DB_BACKUP/04
mv $DB_BACKUP/03 $DB_BACKUP/04
mv $DB_BACKUP/02 $DB_BACKUP/03
mv $DB_BACKUP/01 $DB_BACKUP/02
mkdir $DB_BACKUP/01
cd $DB_BACKUP/ && cd $DB_BACKUP/01
$MYSQL -u $DB_USER –password=$DB_PASSWD -Bse ‘show databases’ |while read m; \
do $MYSQLDUMP -u $DB_USER –password=$DB_PASSWD `echo $m` > `echo $m`.sql;done
bzip2 *sql
echo “* Creating new backup…”
echo “Backup done! `date`” > /tmp/my_report.log
# You can set the script to send you mail when backup it’s finished.
mail -s “MySql Backup report” you@yourmail.com < /tmp/my_report.log
echo "----------------------"
echo "Done"
exit 0
Backup manuale
Nel caso si volesse effettuare un backup manuale di uno specifico database, è possibile utilizzare il comando:
# mysqldump --opt -u [user_name] -p [database_name] > [backup_file].dump
Per esportare tutti i database del server:
# mysqldump -u root -p -all-databases > dump.sql
Per esportare solo la struttura di un database:
# mysqldump -u root -p -no-data nome_database > dump.sql
Per esportare solo i dati di un database:
# mysqldump -u root -p –no-create-info nome_database > dump.sql
Ripristino del database
Il ripristino potrà essere effettuato con il comando:
# mysql -u [username] -p [database_name] < [backup_file].dump
Oppure con la sequenza:
# mysql -u root -p
Enter Password
mysql> use database_name
Database changed
mysql> source [backup_file].dump