命令行输入3个参数:
参数1:要恢复的全量备份文件名
参数2:要恢复到的增量备份文件名
参数3(若数据库已存在,则再输入第三个参数:yes)
下面是shell脚本,已测试的demo
#!/bin/bash
# 判断是否输入参数2个必要参数
if [ $# -ne 2 -a $# -ne 3 ]; then
echo -e "\033[31m 如需恢复数据请输入脚本加至少2个参数,即: sh $0 参数1:要恢复的全量备份文件名 参数2:要恢复到的增量备份文件名,(若数据库已存在,则再输入第三个参数:yes) \033[0m"
echo -e "\033[31m 示例1:recover_data_from_fullinc_tj_test.sh test_backdb-0.sql.tar.gz mysql-bin.000100.tar.gz \033[0m"
echo -e "\033[31m 示例2:recover_data_from_fullinc_tj_test.sh test_backdb-0.sql.tar.gz mysql-bin.000100.tar.gz yes \033[0m"
exit -1
fi
echo "参数1:$1" echo "参数2:$2" echo "参数3:$3"
#参数1
if [ x"$1" = x ]; then
#参数1 不存在
echo -e "\033[31m 缺少参数1,请输入参数 \033[0m"
exit -2
fi
#参数2
if [ x"$2" = x ]; then
#参数2 不存在
echo -e "\033[31m 缺少参数2,请输入参数 \033[0m"
exit -3
fi
#获取参数1 全量备份文件的名称
ql_filename=$1
#获取参数2 增量日志备份文件的名称
zlrz_end_filename=$2
#获取参数3 数据库存在,需要先删除数据库,再进行数据恢复
flag_do=$3
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="username"
mysql_password="xxxxxx"
mysql_host="127.0.0.1"
mysql_port="3306"
db_name="test"
#恢复数据过程日志文件
logFile=/data2/mysql_recovery_logs/bak.log
# 判断mysql实例是否正常运行
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
echo -e "\033[31m ERROR: MySQL is not running! please start the MySQL service first! \033[0m"
exit -4
else
echo "MySQL is runing!"
fi
# 查看数据库是否存在
mysql -u$mysql_user -p$mysql_password -h$mysql_host -e "use $db_name" 2>/dev/null
flag=`echo $?`
if [ $flag -eq 0 -a x"$flag_do" != xyes ];then
echo -e "\033[31m 数据库:$db_name,已存在,确定要使用该脚本进行恢复,则重新执行脚本并添加参数3:yes \033[0m"
exit -5
elif [ $flag -eq 0 -a x"$flag_do" = xyes ];then
echo "now start to drop database $db_name"
mysql -u$mysql_user -p$mysql_password -h$mysql_host -e "drop database $db_name" 2>/dev/null
if [ $? -ne 0 ];then
echo -e "\033[31m drop database $db_name fail,请手动删除数据库$db_name \033[0m"
exit -55
fi
fi
#nas全量数据备份目录
qlbackupDir=/mnt/naswxgzh/mysql_bak
#nas增量日志备份目录
backupDir=/mnt/naswxgzh/mysqlbin_bak
#获取参数1 全量备份文件的名称
ql_filename=$1
#获取参数2 增量日志备份文件的名称
zlrz_end_filename=$2
#全量备份文件的全目录+文件名
ql_dir_filename=$qlbackupDir/$ql_filename
#检测全量备份文件是否存在
if [ ! -f $ql_dir_filename ]; then
echo -e "\033[31m $ql_dir_filename 文件不存在,请核实! \033[0m"
exit -6
fi
#zlrz备份文件的全目录+文件名
zl_end_dir_filename=$backupDir/$zlrz_end_filename
#检测zlrz备份文件是否存在
if [ ! -f $zl_end_dir_filename ]; then
echo -e "\033[31m $zl_end_dir_filename 文件不存在,请核实! \033[0m"
exit -7
fi
#获取全量备份文件的最后修改时间-时间戳
ql_modify_timestamp=`stat -c %Y $ql_dir_filename`
#格式化时间戳为日期时间格式
ql_modify_format=`date '+%Y-%m-%d %H:%M:%S' -d @$ql_modify_timestamp`
#获取增量备份文件的最后修改时间-时间戳
zlrz_modify_timestamp=`stat -c %Y $zl_end_dir_filename`
#echo $zlrz_modify_timestamp
#判断时间范围是否有效
if [ $ql_modify_timestamp -ge $zlrz_modify_timestamp_after ]; then
#不存在 可以恢复的备份日志文件
echo -e "\033[31m 脚本参数不合理,“参数2-增量日志备份文件的生成时间”要大于“参数1-全量备份文件的生成时间”,请核实参数! \033[0m"
exit -8
fi
#时间延后10分钟
zlrz_modify_timestamp_after=`expr $zlrz_modify_timestamp + 600`
#格式化时间戳为日期时间格式
zlrz_modify_format=`date '+%Y-%m-%d %H:%M:%S' -d @$zlrz_modify_timestamp_after`
#echo "zlrz_modify_format:$zlrz_modify_format"
#备份增量日志文件,开始时间
zlrz_begin_filename_time=$ql_modify_format
#echo "zlrz_begin_filename_time:$zlrz_begin_filename_time"
#备份增量日志文件,结束时间
zlrz_end_filename_time=$zlrz_modify_format
#echo "zlrz_end_filename_time:$zlrz_end_filename_time"
#进入nas增量日志备份目录
cd $backupDir
#查找这个时间范围内,增量日志备份文件
zlrz_files=`find ./ -maxdepth 1 -name "mysql-bin.*.tar.gz" -type f -newermt "$zlrz_begin_filename_time" ! -newermt "$zlrz_end_filename_time" | sort`
echo ${zlrz_files[*]}
#所有增量日志文件
zlrz_files_all=${zlrz_files[*]}
now_date=`date +%Y%m%d%H%M%S`
#恢复数据——全量备份文件解压后存放目录
fixed_ql=/data2/mysql_recovery
#恢复数据-增量备份文件解压后临时存放目录
fixed_zlrz=/data2/mysqlbin_recovery
#判断增量日志临时恢复目录是否存在
if [ ! -d $fixed_zlrz/$now_date ]; then
mkdir -p $fixed_zlrz/$now_date
fi
#遍历增量日志备份文件,解压到临时目录--/data2/mysqlbin_recovery
for zlrz_file in $zlrz_files_all;do
#解压日志备份文件到-临时目录
tar -zxvf $zlrz_file -C $fixed_zlrz/$now_date
if [ $? -eq 0 ]; then
echo "解压文件:$zlrz_file到$fixed_zlrz/$now_date目录,成功!"
else
echo -e "\033[31m 解压文件:$zlrz_file到$fixed_zlrz/$now_date目录,失败! \033[0m"
exit -9
fi
done
#解压全量备份文件到-临时目录--/data2/mysql_recovery
if [ ! -d $fixed_zlrz ]; then
mkdir -p $fixed_zlrz
fi
tar -zxvf $ql_dir_filename -C $fixed_ql
if [ $? -eq 0 ]; then
echo "解压文件:$ql_dir_filename到$fixed_ql目录,成功!"
else
echo -e "\033[31m 解压文件:$ql_dir_filename到$fixed_ql目录,失败! \033[0m"
exit -10
fi
#全量备份文件解压后文件名
ql_name=${ql_filename/.tar.gz/}
#恢复全量数据
mysql -u$mysql_user -p$mysql_password -h$mysql_host -P$mysql_port < $fixed_ql/$ql_name 2>/dev/null
flag=`echo $?`
#全量数据恢复成功
if [ $flag == "0" ];then
echo "ql data:$fixed_ql/$ql_name,recover success!"
echo ql data:$fixed_ql/$ql_name,recover success! >> $logFile
cd $fixed_zlrz/$now_date
#当前目录下遍历增量日志文件,并恢复增量数据
for file_item in ./*;do
if [ -f $file_item ]; then
mysqlbinlog $file_item | mysql -u$mysql_user -p$mysql_password -h$mysql_host -P$mysql_port 2>/dev/null
if [ $? -eq 0 ]; then
echo "zlrz data:$file_item,recover success!"
echo zlrz data:$file_item,recover success! >> $logFile
else
echo -e "\033[31m zlrz data:$file_item,recover fail! \033[0m"
echo zlrz data:$file_item,recover fail! >> $logFile
exit -11
fi
fi
done
else
echo -e "\033[31m ql data:$fixed_ql/$ql_name,recover fail! \033[0m"
echo ql data:$fixed_ql/$ql_name,recover fail! >> $logFile
exit -12
fi