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 -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