File: /home/backup_data.sh
#!/bin/bash
############
# Settings #
############
# mysql parameters
MYSQL_USER="root"
MYSQL_PASSWORD="21YC#rIbzS"
MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"
BACKUP_LOCATION="/home/backups/mysql/"
BACKUP_SQLDIR=$BACKUP_LOCATION$(date +%Y-%m-%d_%H-%M)
EXCLUDE_DBS="(Database|information_schema|phpmyadmin|mysql|performance_schema)"
EXCLUDE_EGX="(MEMORY|ARCHIVE)"
GZIP_ENABLED=1
##############
# THE SCRIPT #
##############
echo "sophisticated dump of mysql databases"
echo "destination: $BACKUP_SQLDIR"
echo "ignore these databases: $EXCLUDE_DBS"
echo "ignore these engines: $EXCLUDE_EGX"
echo "gzipping: $GZIP_ENABLED"
#returns list of ignired tables
ignoredtables () {
local IGNORES
TABLES=`$MYSQL --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "USE $1; SHOW TABLE STATUS;" | grep -E $EXCLUDE_EGX | awk '{print $1}'`
for CURRENT_TB in $TABLES; do
IGNORES="$IGNORES --ignore-table=$1.$CURRENT_TB"
done
echo $IGNORES
}
if [ ! -d "$BACKUP_SQLDIR" ]; then
echo "make dir: "$BACKUP_SQLDIR
mkdir -p $BACKUP_SQLDIR
fi
# get a list of databases
DATABASES=`$MYSQL --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev $EXCLUDE_DBS`
# dump each database in turn
echo "dumping databases..."
TIME_SPENT=`date +%s`
OVERAL_SPENT=`date +%s`
for CURRENT_DB in $DATABASES; do
echo $CURRENT_DB
IGNORED_TABLES=`ignoredtables $CURRENT_DB`
if [ $GZIP_ENABLED == 1 ]; then
$MYSQLDUMP --force --opt --routines --user=$MYSQL_USER --password=$MYSQL_PASSWORD $IGNORED_TABLES $CURRENT_DB | gzip > "$BACKUP_SQLDIR/$CURRENT_DB.sql.gz"
else
$MYSQLDUMP --force --opt --routines --user=$mYSQL_USER --password=$MYSQL_PASSWORD $IGNORED_TABLES $CURRENT_DB > "$BACKUP_SQLDIR/$CURRENT_DB.sql"
fi
TIME_SPENT=$((`date +%s` - $TIME_SPENT))
echo "spent: "$TIME_SPENT"s overal: "$((`date +%s` - $OVERAL_SPENT))"s"
TIME_SPENT=`date +%s`
done
# removes previous backup older then 7 days
find $BACKUP_LOCATION -mtime +7 -type d -exec rm -Rv {} \;
echo "[done]"