2015-12-24 12:43:53 +01:00
#!/bin/bash
VERBOSE = 0
COMPRESS = 'bzip2'
USER = 'mysql'
GROUP = 'mysql'
2015-12-24 15:02:31 +01:00
DIRECTORYATTRIBUTES = 0770
2015-12-24 12:43:53 +01:00
FILEATTRIBUTES = 640
TIME_REMOVED_DUMP_FILES = '1 week ago'
BACKUP_DIR = '/var/backups/mysql'
CONFIG_FILE = '/etc/mysql/debian.cnf'
# === DO NOT EDIT BELOW THIS LINE ===
if [ ! -n " $BASH " ] ; then echo Please run this script $0 with bash; exit 1; fi
2016-01-22 12:52:56 +01:00
# === FUNCTIONS ===
if [ -f '/etc/debian_version' ] ; then
CONFIG_FILE = '/etc/mysql/debian.cnf'
else
CONFIG_FILE = '~/mysql_utils/etc/mysql/debian.cnf'
fi
2015-12-24 12:43:53 +01:00
# === FUNCTION ===
f_log( )
{
2016-02-16 16:58:00 +01:00
local bold = $( tput bold)
local yellow = $( tput setf 6)
local red = $( tput setf 4)
local green = $( tput setf 2)
local reset = $( tput sgr0)
local toend = $( tput hpa $( tput cols) ) $( tput cub 6)
2015-12-24 12:43:53 +01:00
logger " BACKUP: $@ "
if [ $VERBOSE -eq 1 ] ; then
echo " BACKUP: $@ "
fi
}
prepaire_skip_expression( )
{
local array_skip = ( " ${ @ } " )
for skip in " ${ array_skip [@] } " ; do
if [ -x $return ] ; then
local return = " ^ $skip \$ "
else
return = " $return |^ $skip \$ "
fi
done
echo ${ return }
}
backup( )
{
f_log " START "
query = "SHOW databases;"
local default_databases_exclude = (
'information_schema'
'performance_schema'
)
local array_views = ( )
touch $DST /$DATABASE /error.log
mkdir -p $DST /$DATABASE 2>/dev/null 1>& 2
chown $USER :$GROUP $DST /$DATABASE
chmod $DIRECTORYATTRIBUTES $DST /$DATABASE
query = " SHOW CREATE DATABASE \` $DATABASE \`; "
mysql --defaults-extra-file= $CONFIG_FILE --skip-column-names -B -e " $query " | awk -F"\t" '{ print $2 }' > $DST /$DATABASE /__create.sql
if [ -f $DST /$DATABASE /__create.sql ] ; then
f_log " > Export create"
fi
query = "SHOW FULL TABLES WHERE Table_type = 'VIEW';"
for viewName in $( mysql --defaults-extra-file= $CONFIG_FILE $DATABASE -N -e " $query " | sed 's/|//' | awk '{print $1}' ) ; do
mysqldump --defaults-file= $CONFIG_FILE $DATABASE $viewName >> $DST /$DATABASE /__views.sql 2>> $DST /$DATABASE /error.log
array_views += ( $viewName )
done
if [ -f $DST /$DATABASE /__views.sql ] ; then
f_log " > Exports views"
fi
mysqldump --defaults-file= $CONFIG_FILE --routines --no-create-info --no-data --no-create-db --skip-opt $DATABASE 2>> $DST /$DATABASE /error.log | sed -e 's/DEFINER=[^*]*\*/\*/' > $DST /$DATABASE /__routines.sql
if [ -f $DST /$DATABASE /__routines.sql ] ; then
f_log " > Exports Routines"
fi
local default_tables_exclude = (
'slow_log'
'general_log'
)
tables_exclude = ( ${ default_tables_exclude [@] } ${ array_views [@] } ${ EXCLUDE_TABLES [@] } )
2016-09-26 14:21:25 +02:00
tables_exclude_expression = $( prepaire_skip_expression " ${ tables_exclude [@] } " )
2015-12-24 12:43:53 +01:00
f_log " Exclude tables: $tables_exclude_expression "
data_tables_exclude = ( ${ EXCLUDE_DATA_TABLES [@] } )
2016-09-26 14:21:25 +02:00
data_tables_exclude_expression = $( prepaire_skip_expression " ${ data_tables_exclude [@] } " )
2015-12-24 12:43:53 +01:00
f_log " Exclude data tables: $data_tables_exclude_expression "
2016-09-26 14:21:25 +02:00
tables = ( ${ TABLES [@] } )
tables_expression = $( prepaire_skip_expression " ${ tables [@] } " )
f_log " Only tables: $tables_expression "
2015-12-24 12:43:53 +01:00
query = "SHOW TABLES;"
2016-09-26 14:21:25 +02:00
command = " mysql --defaults-extra-file= $CONFIG_FILE --skip-column-names -B $DATABASE -e \" $query \" "
if [ $tables_exclude_expression ] ; then
command = " $command | egrep -v \" $tables_exclude_expression \" "
fi
if [ $tables_expression ] ; then
command = " $command | egrep \" $tables_expression \" "
fi
f_log " Command: $command "
for TABLE in $( eval $command ) ; do
f_log " ** Dump $DATABASE . $TABLE "
2015-12-24 12:43:53 +01:00
if [ $( echo $data_tables_exclude_expression | grep $TABLE ) ] ; then
f_log " Exclude data from table $TABLE "
2016-10-17 15:30:58 +02:00
mysqldump --defaults-file= $CONFIG_FILE --no-data --add-drop-table --tab= $DST /$DATABASE / $DATABASE $TABLE 2>> $DST /$DATABASE /error.log
2015-12-24 12:43:53 +01:00
else
2016-10-17 15:30:58 +02:00
# If fields has geospatial types
checkGeo = " mysql --defaults-extra-file= $CONFIG_FILE -B $DATABASE -e \"SHOW COLUMNS FROM $TABLE WHERE Type IN ('point', 'polygon', 'geometry', 'linestring')\" "
hasGeo = $( eval $checkGeo )
if [ ! -z " $hasGeo " ] ; then
mysqldump --defaults-file= $CONFIG_FILE --flush-logs --default-character-set= utf8 --add-drop-table --quick --result-file= $DST /$DATABASE /$TABLE .sql $DATABASE $TABLE 2>> $DST /$DATABASE /error.log
else
mysqldump --defaults-file= $CONFIG_FILE --flush-logs --default-character-set= utf8 --add-drop-table --quick --tab= $DST /$DATABASE / $DATABASE $TABLE 2>> $DST /$DATABASE /error.log
fi
2015-12-24 12:43:53 +01:00
fi
if [ -f " $DST / $DATABASE / $TABLE .sql " ] ; then
chmod $FILEATTRIBUTES $DST /$DATABASE /$TABLE .sql
chown $USER :$GROUP $DST /$DATABASE /$TABLE .sql
f_log " ** set perm on $DATABASE / $TABLE .sql "
else
f_log " ** WARNING : $DST / $DATABASE / $TABLE .sql not found "
fi
if [ -f " $DST / $DATABASE / $TABLE .txt " ] ; then
if [ $COMPRESS ] ; then
f_log " ** $COMPRESS $DATABASE / $TABLE .txt in background "
if [ $COMPRESS = = 'bzip2' ] ; then
if [ -f " $DST / $DATABASE / $TABLE .txt.bz2 " ] ; then
rm $DST /$DATABASE /$TABLE .txt.bz2
fi
( $COMPRESS $DST /$DATABASE /$TABLE .txt && chmod $FILEATTRIBUTES $DST /$DATABASE /$TABLE .txt.bz2 && chown $USER :$GROUP $DST /$DATABASE /$TABLE .txt.bz2) &
elif [ $COMPRESS = = 'gzip' ] ; then
if [ -f " $DST / $DATABASE / $TABLE .txt.gz " ] ; then
rm $DST /$DATABASE /$TABLE .txt.gz
fi
( $COMPRESS $DST /$DATABASE /$TABLE .txt && chmod $FILEATTRIBUTES $DST /$DATABASE /$TABLE .txt.gz && chown $USER :$GROUP $DST /$DATABASE /$TABLE .txt.gz) &
fi
fi
else
f_log " ** WARNING : $DST / $DATABASE / $TABLE .txt not found "
fi
done
f_log " END "
}
2016-01-22 12:52:56 +01:00
usage( )
{
cat << EOF
This mysql backup engine.
Usage: $0 <[ database-name] > <[ options] > or bash $0 <[ database-name] > <[ options] >
Options:
2016-09-26 14:21:25 +02:00
--tables= Dump only such tables
2016-01-22 12:52:56 +01:00
--exclude-tables= Exclude tables
--exclude-data-tables= Exclude data tables
-c= | --compress= Compress with gzip or bzip2
-v | --verbose Add verbose into output
-l | --lifetime= Lifetime for dump files
--config= Config file of Debian format
--dir= Backup directory
-h | --help This text
Examples:
backup.sh --verbose --compress=
2016-02-16 14:43:23 +01:00
backup.sh --verbose --compress= gzip
2016-01-22 12:52:56 +01:00
backup.sh --verbose --compress= bzip2
backup.sh --verbose --compress=
backup.sh --verbose --compress= --lifetime= "3 day ago"
backup.sh --verbose --config= "/etc/mysql/debian.cnf" --lifetime= "1 day ago"
backup.sh --verbose --dir= "/var/backups/mysql" --config= "/etc/mysql/debian.cnf" --lifetime= "1 day ago"
backup.sh --verbose --dir= "/home/backups/mysql" --lifetime= "1 day ago"
backup.sh --verbose --dir= "/home/backups/mysql" --exclude-tables= "tbl_template" --lifetime= "1 day ago"
2016-09-26 14:21:25 +02:00
backup.sh --verbose --dir= "/home/backups/mysql" --tables= "tbl_template tbl_template1 tbl_template2"
2016-03-17 22:15:50 +01:00
2016-01-22 12:52:56 +01:00
EOF
}
2015-12-24 12:43:53 +01:00
if [ $# = 0 ] ; then
usage;
exit;
fi
DATABASE = ''
2016-09-26 14:21:25 +02:00
TABLES = ''
2015-12-24 12:43:53 +01:00
EXCLUDE_TABLES = ''
EXCLUDE_DATA_TABLES = ''
BIN_DEPS = " mysql mysqldump $COMPRESS "
2016-01-22 12:52:56 +01:00
DATABASE = " $1 "
2015-12-24 12:43:53 +01:00
for BIN in $BIN_DEPS ; do
which $BIN 1>/dev/null 2>& 1
if [ $? -ne 0 ] ; then
echo " Error: Required command file not be found: $BIN "
exit 1
fi
done
for i in " $@ "
do
case $i in
2016-09-26 14:21:25 +02:00
-t= * | --tables= *)
TABLES = ( " ${ i #*= } " )
shift # past argument=value
; ;
2015-12-24 12:43:53 +01:00
--exclude-tables= *)
EXCLUDE_TABLES = ( " ${ i #*= } " )
shift # past argument=value
; ;
--exclude-data-tables= *)
EXCLUDE_DATA_TABLES = ( " ${ i #*= } " )
shift # past argument=value
; ;
-c= * | --compress= *)
COMPRESS = ( " ${ i #*= } " )
shift # past argument=value
; ;
-l= * | --lifetime= *)
TIME_REMOVED_DUMP_FILES = ( " ${ i #*= } " )
shift # past argument=value
; ;
--dir= *)
BACKUP_DIR = ( " ${ i #*= } " )
shift # past argument=value
; ;
--config= *)
CONFIG_FILE = ( " ${ i #*= } " )
shift # past argument=value
; ;
-v | --verbose)
VERBOSE = 1
shift # past argument=value
; ;
-h | --help)
usage
exit
; ;
*)
# unknown option
; ;
esac
done
DATE = ` date '+%Y.%m.%d' `
DATEOLD = ` date --date= " $TIME_REMOVED_DUMP_FILES " +%Y.%m.%d`
DST = $BACKUP_DIR /$DATE
DSTOLD = $BACKUP_DIR /$DATEOLD
if [ ! -d " $DST " ] ; then
mkdir -p $DST ;
chmod $DIRECTORYATTRIBUTES $DST ;
2015-12-24 15:30:52 +01:00
chown $USER :$GROUP $DST ;
2015-12-24 12:43:53 +01:00
fi
if [ -d " $DSTOLD " ] ; then
rm -fr $DSTOLD ;
fi
# === SETTINGS ===
f_log "============================================"
2016-04-27 12:44:34 +02:00
f_log " Dump into: $DST "
2015-12-24 12:43:53 +01:00
f_log " Config file: $CONFIG_FILE "
f_log " Verbose: $VERBOSE "
f_log " Compress: $COMPRESS "
f_log " Database: $DATABASE "
2016-09-26 14:21:25 +02:00
f_log " Tables: $TABLES "
2015-12-24 12:43:53 +01:00
f_log " Exclude tables: $EXCLUDE_TABLES "
f_log " Life time: $TIME_REMOVED_DUMP_FILES "
f_log "============================================"
f_log ""
# === AUTORUN ===
backup