Backup di database MySQL
Parametri da linea di comando:
- all -> esegue il backup dei database elencati da "SHOW DATABASES"
- "nome_db1 nome_db2 nome_dbN" -> esegue il backup dei soli database specificati
Variabili personalizzabili:
- /etc/FILE_ACCESSO -> file contenente i dati di accesso al/ai datanase da salvare: USR e PWD
- MAX_BACKUPS -> Numero di backup da mantenere
- SKIP -> Database da NON salvare
- DEST -> Cartella di destinazione backup: al suo interno verrà creata una cartella apposita
- MBD -> Cartella da creare all'interno della cartella di destinazione
- RIGHTS_DIR -> Diritti ottali da assegnare a directory di backup
- RIGHTS_TAR -> Diritti ottali da assegnare ad ogni file gz creato
Codice:
#!/bin/bash
# Backup MySql databases
# --------------------------------------------------------------------
# This is a free shell script under GNU GPL version 2.0 or above
# Copyright (C) 2004, 2005 nixCraft project
# Feedback/comment/suggestions : http://cyberciti.biz/fb/
# -------------------------------------------------------------------------
# Copyleft (C) 2011-2012 Gimli
# -------------------------------------------------------------------------
# 20110922 - v1.0
# 20110923 - v2.0
# 20120716 - v3.0
# 20120717 - v3.1
# 20120718 - v3.2
# -------------------------------------------------------------------------
# Inclusione per prima: precedenza a parametri impostati in questo script
. /etc/FILE_ACCESSO
###########################################################################
# ------------------------------------------------------------------------#
# Impostazioni personalizzabili - inizio
#
# Numero di backup da mantenere
MAX_BACKUPS=30
# Nome host server MySQL (opzione -h mysqldump)
MyHOST="localhost"
# Database da NON BACKUPPARE
SKIP=""
# Cartella di destinazione backup: al suo interno verrà creata una cartella
# apposita
DEST="/home/gimli/backup"
# Cartella da creare all'interno della cartella di destinazione
# (poò anche essere uguale DEST: i diritti non saranno modificati)
MBD="$DEST/mysql"
# Diritti ottali da assegnare a directory di backup
RIGHTS_DIR="0700"
# Diritti ottali da assegnare ad ogni file gz creato
RIGHTS_TAR="0600"
#
# Impostazioni personalizzabili - fine
# ------------------------------------------------------------------------#
###########################################################################
###########################################################################
# ------------------------------------------------------------------------#
# Percorsi assoluti binari utilizzati (importanti per crontab)
#
# mysql usato per 'SHOW DATABASES'
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
#COMPRESSOR="$(which gzip)"; EXTENSION="gz"
COMPRESSOR="$(which bzip2)"; EXTENSION="bz2"
#COMPRESSOR="$(which xz)"; EXTENSION="xz"
SED="$(which sed)"
HOSTNAME="$(which hostname)"
#
# Percorsi assoluti binari utilizzati - fine
# ------------------------------------------------------------------------#
###########################################################################
usage()
{
cat << EOF
utilizzo: $0 opzioni
Questo script esegue backup di database mysql.
Specificare una delle seguenti azioni:
all : backup dei database elencati da "SHOW DATABASES"
like '%condizione%' : backup dei database che soddisfano la condizione.
test '%condizione%' : mostra i database che soddisfano la condizione.
"nome_db1 nome_db2 nome_dbN" : backup dei soli database specificati.
EOF
}
# Lista di database
TEST=0
if [ "$1" == "test" ]; then
TEST=1
fi
DBS=$(if [ -z "$1" ]; then
:
elif [ "$1" == "all" ]; then
echo 'show databases' | $MYSQL -u $USR -h $MyHOST --password="$PWD" -Bs
elif [ "$1" == "like" ]; then
echo "SHOW DATABASES LIKE '$2'" | $MYSQL -u $USR -h $MyHOST --password="$PWD" -Bs
elif [ "$1" == "test" ]; then
echo "SHOW DATABASES LIKE '$2'" | $MYSQL -u $USR -h $MyHOST --password="$PWD" -Bs
else
echo "$1"
fi)
if [ -z "$DBS" ]; then
echo "Nessun database selezionato!"
usage
exit 1
fi
if [[ TEST -eq 1 ]]; then
for db in $DBS ; do
skipdb=0
if [ "$SKIP" != "" ] ; then
for i in $SKIP ; do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [[ $skipdb -eq 0 ]] ; then
echo $db
fi
done
exit 0
fi
# Creazione cartella destinazione e impostazione diritti
[ ! -d $MBD ] && mkdir -p $MBD || :
if [ "$MBD" != "$DEST" ]; then
# owner root
$CHOWN 0.0 -R $MBD
# Applica diritti
$CHMOD $RIGHTS_DIR $MBD
fi
# hostname: utilizzato in nome file
HOST="$($HOSTNAME)"
# data: utilizzata in nome file
NOW="$(date +"%Y-%m-%d_%H.%M")"
for db in $DBS ; do
skipdb=0
if [ "$SKIP" != "" ] ; then
for i in $SKIP ; do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [[ $skipdb -eq 0 ]] ; then
# Inizio nome file per conta (paranoia spazi)
FILE_PREFIX="$(echo "$MBD/$db.$HOST" | tr -d [:blank:])"
# Nome nuovo backup (paranoia spazi)
FILE="$(echo "$FILE_PREFIX.$NOW.sql.$EXTENSION" | tr -d [:blank:])"
# Elenco backup precedenti (paranoia rimozione spazi, poi testo esistenza file)
FILE_PREV=( $(ls "$FILE_PREFIX"*.sql.* 2>/dev/null | tr -d [:blank:]) )
# Mantengo solo gli ultimi $MAX_BACKUPS - 1 (a cui si sommerà il nuovo)
if (( ${#FILE_PREV[@]} > (($MAX_BACKUPS - 1)) )) ; then
let "NUM_DEL=${#FILE_PREV[@]} - $MAX_BACKUPS + 1"
for (( ; NUM_DEL > 0; NUM_DEL-- )) ; do
if [ -f "${FILE_PREV[$NUM_DEL]}" ] ; then
rm "${FILE_PREV[$NUM_DEL]}"
fi
done
fi
ERROR_MESSAGE=$( {
$MYSQLDUMP --add-drop-database --quick -c -e -F -l -u $USR -h $MyHOST --password="$PWD" --databases $db | \
$SED -e 's|/\*\!40000 DROP DATABASE IF EXISTS \(`.*`\)\*/;|DROP DATABASE IF EXISTS \1;|' | \
$COMPRESSOR > "$FILE" ;
if [[ ${PIPESTATUS[0]} -ne 0 ]] ; then
exit 1
elif [[ ${PIPESTATUS[1]} -ne 0 ]] ; then
exit 2
elif [[ ${PIPESTATUS[2]} -ne 0 ]] ; then
exit 3
fi
exit 0
} 2>&1 )
RETURN=$?
if [[ $RETURN -ne 0 ]] ; then
if [ -f "$FILE" ] ; then
rm "$FILE"
fi
# mysqldump o gzip fallito!
FILE="$MBD/_FAILED.$db.$HOST.$NOW.FAILED_.txt"
touch "$FILE"
echo "$ERROR_MESSAGE" > "$FILE"
fi
# Applica diritti al file
$CHMOD $RIGHTS_TAR "$FILE"
fi
done
Avete suggerimenti per semplificare i vari salti mortali che ho utilizzato per intercettare valore di ritorno e messaggi di errore di mysqldump e gzip?