说明
该脚本实现了自动备份MySQL数据库中任意数据库,适合放在crond中运行,定时备份数据库,且在有需要的时候实现自动恢复备份。该脚本只针对库备份,无法实现对表备份
配置信息
DB_HOST=192.168.0.51 #数据库主机IP
DB_PORT=3306 #数据库端口
DB_USER=root #以什么身份运行
DB_PASSWORD=password #数据库密码
DB_EXPIRE=7 #自动清理一周以前的备份文件
DB_BACKUP_DIR=/backup/mysql #备份文件保存位置
BASE_DIR=$(cd $(dirname $0);pwd) #脚本运行的路径
BACK_LOG=$BASE_DIR/backup.log #备份与恢复日志保存位置
命令格式
# 备份
bash mysql-backup.sh backup database-name1 database-name2 database-name3 .....
# 恢复
bash mysql-restore.sh restore /the/path/backup1.sql.gz /the/path/backup2.sql.gz .....
日志内容
--------------------------------------------
[ OK ] 当前身份: ROOT
[ OK ] 时间: 2021-05-09 22:05:56,需要备份的数据库有: test1 test2
[ OK ] 时间: 2021-05-09 22:05:58,数据库: test1 备份成功,备份文件存放路径为: /backup/mysql/test1-2021-05-09.sql.gz
[ OK ] 时间: 2021-05-09 22:05:00,数据库: test2 备份成功,备份文件存放路径为: /backup/mysql/test2-2021-05-09.sql.gz
--------------------------------------------
[ OK ] 当前身份: ROOT
[ OK ] 时间: 2021-05-09 22:05:14,需要恢复的备份有: /backup/mysql/test1-2021-05-09.sql.gz /backup/mysql/test2-2021-05-09.sql.gz
[ OK ] 时间: 2021-05-09 22:05:18,/backup/mysql/test1-2021-05-09.sql.gz 备份文件恢复成功
[ OK ] 时间: 2021-05-09 22:05:21,/backup/mysql/test2-2021-05-09.sql.gz 备份文件恢复成功
脚本内容
#!/bin/bash
DB_HOST=192.168.0.51
DB_PORT=3306
DB_USER=root
DB_PASSWORD=password
DB_EXPIRE=7
DB_BACKUP_DIR=/backup/mysql
BASE_DIR=$(cd $(dirname $0);pwd)
BACK_LOG=$BASE_DIR/backup.log
function error_text(){
echo "[ ERROR ] $@" >>$BACK_LOG
}
function ok_text(){
echo "[ OK ] $@" >>$BACK_LOG
}
function check_dir(){
if [ ! -d $DB_BACKUP_DIR ]; then
mkdir -p /backup/mysql
fi
}
function check_user(){
if [ $(id -u -n) != "root" ];then
error_text "请使用root运行脚本"
exit 1
else
ok_text "当前身份: ROOT"
fi
}
function check_mysql(){
# 检查服务是否起来
if [ $(ps -aux|grep mysql|grep -v mysql-backup|grep -v grep|wc -l) -eq 0 ]; then
error_text "MySQL服务没有启动"
exit 1
fi
# 连接数据库,检查是否能正常使用
mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD -e "show processlist;" &>/dev/null
if [ $? -ne 0 ]; then
error_text "MySQL服务异常"
exit 1
fi
}
function backup(){
# 检查是否带了备份数据库的参数
if [ $# -eq 0 ]; then
echo -e "[ ERROR ] 必须在脚本后边带要备份的数据库,空格分开多个数据库" >> $BACK_LOG
exit 1
fi
# 开始备份
ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),需要备份的数据库有: $@"
for i in $@
do
if [ $(mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD -e "show databases"|grep -oE "^$i$"|wc -l) -ne 1 ]; then
error_text "数据库: $i 备份失败,没有这个库" >>$BACK_LOG
else
mysqldump -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD -B $i --master-data=2 --single-transaction|gzip>${DB_BACKUP_DIR}/${i}-$(date "+%F").sql.gz
if [ $? -eq 0 ];then
ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),数据库: $i 备份成功,备份文件存放路径为: ${DB_BACKUP_DIR}/${i}-$(date "+%F").sql.gz"
else
error_text "数据库: $i 备份失败" >>$BACK_LOG
fi
fi
done
}
function check_expire(){
find $DB_BACKUP_DIR -mtime +7 -exec rm -rf {} \;
}
function restore(){
# 检查是否带了恢复数据库的参数
if [ $# -eq 0 ]; then
echo -e "[ ERROR ] 必须在脚本后边带要恢复的数据库,空格分开多个数据库" >> $BACK_LOG
exit 1
fi
# 开始恢复
ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),需要恢复的备份有: $@"
for i in $@
do
if [ ! -f $i ]; then
error_text "$i 备份文件不存在,无法恢复"
else
if [[ "$i" == *".gz" ]]; then
/bin/bash -c gunzip < $i | mysql -u$DB_USER -h$DB_HOST -P$DB_PORT -p$DB_PASSWORD
if [ $? -eq 0 ]; then
ok_text "时间: $(date '+%Y-%m-%d %H:%m:%S'),$i 备份文件恢复成功"
else
error_text "$i 备份文件恢复失败"
fi
else
error_text "$i 文件格式不对,无法恢复"
fi
fi
done
}
function useage(){
echo -e "\033[32m***************************************\033[0m"
echo -e "\033[32mMySQL数据库备份与恢复管理脚本使用帮助\033[0m"
echo -e "\033[32mUsage: \033[0m"
echo -e "\033[32m backup 要备份的数据库名字(空格隔开)\033[0m"
echo -e "\033[32m restore 要恢复的数据库文件(空格隔开)\033[0m"
echo -e "\033[32mMySQL 脚本配置信息 \033[0m"
echo -e "\033[32mMySQL IP: $DB_HOST \033[0m"
echo -e "\033[32mMySQL PORT: $DB_PORT \033[0m"
echo -e "\033[32mMySQL USER: $DB_USER \033[0m"
echo -e "\033[32mMySQL PASSWORD: $DB_PASSWORD \033[0m"
echo -e "\033[32mMySQL LOG: $BACK_LOG \033[0m"
echo -e "\033[32mMySQL EXPIRE: ${DB_EXPIRE}day \033[0m"
echo -e "\033[32mMySQL BACKUP DIR: $DB_BACKUP_DIR \033[0m"
echo -e "\033[32m***************************************\033[0m"
}
action=$1
case $1 in
backup)
echo "--------------------------------------------" >>$BACK_LOG
shift
check_user
check_mysql
check_dir
backup $@
check_expire
;;
restore)
echo "--------------------------------------------" >>$BACK_LOG
shift
check_user
check_mysql
restore $@
;;
*)
useage
;;
esac