可带参数,是用来存放备份文件的路径。也可不带参数,此时会有选择菜单:是备份所有库还是一个库(一个库时会要求输入备份的库的名字。同时也需要输入存放备份文件的路径。
#!/bin/sh
# set -x
## this script is for auto mysql backup
## log file: /opt/alu/logs/3rd_party/mysql/backup.log
declare db_names
LOG_FILE=/opt/alu/logs/3rd_party/mysql/backup.log
DATE=`date +"%Y%m%d%H%M%S"`
DUMP_FILE=$DATE".sql"
TGZ_FILE=$DATE".tgz"
SHELL_DIR=/opt/alu/shell/sysmgt
usage(){
echo "Usage:`basename $0`"
echo "OR `basename $0` DB1 [DB2 DB3...]"
}
log_success_msg(){
echo " SUCCESS! $@"
}
log_failure_msg(){
echo " ERROR! $@"
}
p_echo(){
echo >> ${LOG_FILE}
echo "-------------Backup-------------" >> ${LOG_FILE}
echo `date +"%Y-%m-%d %H:%M:%S"` >> ${LOG_FILE}
echo "-------------Backup-------------" >> ${LOG_FILE}
echo >> ${LOG_FILE}
}
## check mysql pid, and kill it
checkProcess(){
PIDS=`ps -ef|grep mysqld|grep -v grep|grep 3306|awk '{print $2}'`
if [ -n ${PIDS} ]; then
for pid in ${PIDS}
do
kill -9 ${pid}
done
fi
}
## check mysql service, make sure it's alive
checkStatus(){
`mysqladmin ping > /dev/null 2>&1`
if [[ $? != 0 ]]; then
checkProcess
echo "mysql is not alive,will be start now!" >> ${LOG_FILE}
${SHELL_DIR}/mysql_supervise.sh start >> ${LOG_FILE} 2>&1
fi
if [[ $? != 0 ]];then
echo "Mysql server error"
exit 1
fi
}
## find all database name
find_db_names(){
DB_NAMES_ALL=$(mysql -e "show databases;")
index=0
for DB in ${DB_NAMES_ALL}
do
if [[ "$DB" != "Database" ]];then
db_names[$index]=$DB
let index++
fi
done
}
## tgz file today exists,delete it
delete_old_file(){
if [ -f $1 ]; then
echo "[$1] Backup file is exists,will be delete" >> ${LOG_FILE}
rm -f $1 > /dev/null 2>&1
fi
}
## mysqldump function
func_mysqldump(){
db_dump_file=$1"_"$DUMP_FILE
db_tgz_file=$1"_"$TGZ_FILE
#delete_old_file $db_tgz_file
mysqldump -q --add-drop-table --single-transaction --lock-tables=false $1 > $db_dump_file
tar -czvf $db_tgz_file $db_dump_file > /dev/null
echo "[${db_tgz_file}] Backup success!" >> ${LOG_FILE}
rm -rf $db_dump_file > /dev/null 2>&1
}
## backup all db
backup_all(){
echo -e "Please enter the directory for save the backup file:"
read dir
if [[ ! -d $dir ]];then
log_failure_msg "directory error!"
exit 1
fi
# find all db name
find_db_names
echo
cd $dir
echo "backup............."
for arr in ${db_names[@]}
do
func_mysqldump $arr
done
echo "Finish"
}
## backup one db user specified
backup_one(){
echo -e "Please enter the db name you want to backup:"
read dbname
find_db_names
flag=1
for arr in ${db_names[@]}
do
if [[ $dbname = $arr ]];then
flag=0
break
else
flag=1
continue
fi
done
if [[ $flag = 1 ]];then
log_failure_msg "db not exist!"
exit 1
fi
echo -e "Please enter the directory for save the backup file:"
read dir
if [[ ! -d $dir ]];then
log_failure_msg "directory error!"
exit 1
fi
echo
# others,all right
cd $dir
echo "backup.................."
func_mysqldump $dbname
echo "Finish"
}
## for one parameter
has_param(){
dir=$1
if [[ ! -d $dir ]];then
log_failure_msg "directory error!"
exit 1
fi
# find all db name
find_db_names
cd $dir
for arr in ${db_names[@]}
do
func_mysqldump $arr
done
exit $?
}
menu(){
echo
PS3="Please select: "
select t in "backup all" "backup one db" "exit"
do
case $t in
'backup all')
backup_all
exit $?
;;
'backup one db')
backup_one
exit $?
;;
*)
exit 1
;;
esac
done
}
######### main
main(){
p_echo
checkStatus
if [[ $# != 0 ]];then
has_param $@
else
menu
fi
}
main $@