龙空技术网

mysql全量&增量数据备份后,进行数据恢复

raingo 65

前言:

目前小伙伴们对“mysql 大数据量备份”大约比较注意,同学们都想要分析一些“mysql 大数据量备份”的相关资讯。那么小编在网上网罗了一些关于“mysql 大数据量备份””的相关知识,希望姐妹们能喜欢,你们一起来学习一下吧!

命令行输入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 -1fiecho "参数1:$1" echo "参数2:$2" echo "参数3:$3"#参数1if [ x"$1" = x ]; then    #参数1 不存在    echo -e "\033[31m 缺少参数1,请输入参数 \033[0m"    exit -2fi#参数2if [ x"$2" = x ]; then    #参数2 不存在    echo -e "\033[31m 缺少参数2,请输入参数 \033[0m"    exit -3fi#获取参数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 -4else    echo "MySQL is runing!"fi# 查看数据库是否存在mysql -u$mysql_user -p$mysql_password -h$mysql_host -e "use $db_name" 2>/dev/nullflag=`echo $?`if [ $flag -eq 0 -a x"$flag_do" != xyes ];then    echo -e "\033[31m 数据库:$db_name,已存在,确定要使用该脚本进行恢复,则重新执行脚本并添加参数3:yes \033[0m"    exit -5elif [ $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    fifi#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 -6fi#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 -7fi#获取全量备份文件的最后修改时间-时间戳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 -8fi#时间延后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_datefi#遍历增量日志备份文件,解压到临时目录--/data2/mysqlbin_recoveryfor 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    fidone#解压全量备份文件到-临时目录--/data2/mysql_recoveryif [ ! -d $fixed_zlrz ]; then    mkdir -p $fixed_zlrzfitar -zxvf $ql_dir_filename -C $fixed_qlif [ $? -eq 0 ]; then    echo "解压文件:$ql_dir_filename到$fixed_ql目录,成功!"else    echo -e "\033[31m 解压文件:$ql_dir_filename到$fixed_ql目录,失败! \033[0m"    exit -10fi#全量备份文件解压后文件名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/nullflag=`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    doneelse    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 -12fi

标签: #mysql 大数据量备份 #mysql数据库全量备份 #mysql恢复上一个时间段的数据