Percona Xtrabackup Linux使用shell脚本进行mysql全量备份/还原,增量备份/还原,差异备份/还原

最近研究数据库备份工具,做个备份

#!/bin/bash

backupDir=/home/backup/mysql/all  #全量备份文件夹
incrementalBackup=/home/backup/mysql/incrementalBackup #增量备份文件夹
differenceBackup=/home/backup/mysql/differenceBackup
mysqlDir=/var/lib/mysql #mysql数据文件夹
user= #数据库帐号
password= #数据库密码
port= #数据库端口
host= #数据库IP
docker_name=mysql_big #docker容器名称
defaultsFile=/etc/my.cnf #数据库配置文件,用于不在/var/lib/mysql 下的数据库
rmData=/home/backup/mysql/rmData #备份数据库目录,防止还原失败数据被删除

#开始时间
timer_start=`date "+%Y-%m-%d %H:%M:%S"`
if [ $1 = 'mysqldump' ];then
    if [ $2 = 'all' ];then
        if [ ! -d ${backupDir} ];then
            mkdir -p ${backupDir}
        else
            /usr/bin/rm -rf ${rmData}/*
        fi
        /usr/bin/rm -rf ${backupDir}/*    #删除全量,增量目录,差异目录
        /usr/bin/rm -rf ${incrementalBackup}
        /usr/bin/rm -rf ${differenceBackup}
        xtrabackup --defaults-file=${defaultsFile} --backup --datadir=${mysqlDir} --target-dir=${backupDir} --user=${user} --password=${password} --port=${port} --host=${host} --no-server-version-check
    elif [ $2 = 'add' ];then
        if [ ! -d ${incrementalBackup} ];then #增量备份文件夹不存在,就创建增量备份文件夹,并执行基于全量备份的增量备份
            mkdir -p ${incrementalBackup}
            xtrabackup --defaults-file=${defaultsFile} --backup --datadir=${mysqlDir} --target-dir=${incrementalBackup}/`date "+%Y%m%d%H%M%S"` --user=${user} --password=${password} --port=${port} --host=${host} --incremental-basedir=${backupDir} --no-server-version-check
        else #增量备份文件夹存在,执行基于最新一次的增量备份的增量备份
            filename=`ls -l ${incrementalBackup}| tail -n 1 | awk '{print $9}'` #取最新文件夹名称
            xtrabackup --defaults-file=${defaultsFile} --backup --datadir=${mysqlDir} --target-dir=${incrementalBackup}/`date "+%Y%m%d%H%M%S"` --user=${user} --password=${password} --port=${port} --host=${host} --incremental-basedir=${incrementalBackup}/${filename} --no-server-version-check
        fi
    elif [ $2 = 'nolike' ];then
        if [ ! -d ${differenceBackup} ];then #增量备份文件夹不存在,就创建增量备份文件夹,并执行基于全量备份的增量备份
            mkdir -p ${differenceBackup}
        fi
        xtrabackup --defaults-file=${defaultsFile} --backup --datadir=${mysqlDir} --target-dir=${differenceBackup}/`date "+%Y%m%d%H%M%S"` --user=${user} --password=${password} --port=${port} --host=${host} --incremental-basedir=${backupDir} --no-server-version-check    
    else
        echo  -e "参数错误\n参数2:all为全量备份,add为增量备份"
    fi

elif [ $1 = 'mysql' ];then
    if [ $2 = 'add' -o  $2 = 'nolike' -o  $2 = 'all' ];then
        if [ ! -d ${rmData} ];then
            mkdir -p ${rmData}  #创建临时存储目录
        fi
        \cp -rf ${mysqlDir}/* ${rmData}
        if [ -d ${backupDir} ];then
            docker stop ${docker_name} #关闭mysql
        else
            echo "全量备份文件夹不存在,退出,请检查"${backupDir}
            exit 0
        fi
    fi
    if [ $2 = 'add' ];then
        if [ ! -d ${incrementalBackup} -a -d ${backupDir} -a `ls ${backupDir} |wc -l` -ge 1 ];then
            echo "增量备份文件夹不存在,只执行全量还原"
            xtrabackup --prepare --target-dir=${backupDir} #预备数据
        elif [ -d ${incrementalBackup} -a `ls ${incrementalBackup} |wc -l` -ge 1 ];then
            echo "增量备份文件夹存在,并有数据,执行全量+增量还原"
            xtrabackup --prepare --apply-log-only --target-dir=${backupDir}
            filename=`ls -l ${incrementalBackup}| tail -n 1 | awk '{print $9}'` #取最新文件夹名称
            for i in `ls ${incrementalBackup}`;
            do
                if [ ${i} != ${filename} ];then
                    xtrabackup --prepare --apply-log-only --target-dir=${backupDir} --incremental-dir=${incrementalBackup}/${i}  #预备数据,把增量备份还原回全量备份文件夹
                else
                    xtrabackup --prepare --target-dir=${backupDir} --incremental-dir=${incrementalBackup}/${filename}  #预备数据,最后一次还原
                fi
            done
        elif [ -d ${incrementalBackup} -a `ls ${incrementalBackup} |wc -l` -eq 0 -a -d ${backupDir} -a `ls ${backupDir} |wc -l` -ge 1 ];then 
            echo "增量还原失败,增量备份文件夹内没有文件,只执行全量还原"
            /user/bin/rm -rf ${incrementalBackup}
            xtrabackup --prepare --target-dir=${backupDir} #预备数据
        else
            echo "增量还原失败!可能是没有全量备份文件夹,请检查"${backupDir}
            exit 0
        fi
    elif [ $2 = 'nolike' ];then
        if [ ! -d ${differenceBackup} -a -d ${backupDir} -a `ls ${backupDir} |wc -l` -ge 1 ];then
            echo "差异备份文件夹不存在,只执行全量还原"
            xtrabackup --prepare --target-dir=${backupDir} #预备数据
        elif [ -d ${differenceBackup} -a `ls ${differenceBackup} |wc -l` -ge 1 ];then
            echo "差异备份文件夹存在,并有数据,执行全量+差异还原"
            filename=`ls -l ${differenceBackup}| tail -n 1 | awk '{print $9}'` #取最新文件夹名称
            xtrabackup --prepare --apply-log-only --target-dir=${backupDir}
            xtrabackup --prepare --target-dir=${backupDir} --incremental-dir=${differenceBackup}/${filename}
        elif [ -d ${differenceBackup} -a `ls ${differenceBackup} |wc -l` -eq 0 -a -d ${backupDir} -a `ls ${backupDir} |wc -l` -ge 1 ];then 
            echo "差异还原失败,差异备份文件夹内没有文件,只执行全量还原"
            /user/bin/rm -rf ${differenceBackup}
            xtrabackup --prepare --target-dir=${backupDir} #预备数据
        else
            echo "差异还原失败!可能是没有全量备份文件夹,请检查"${backupDir}
            exit 0
        fi
    elif [ $2 = 'all' ];then
        if [ -d ${backupDir} -a `ls ${backupDir} |wc -l` -ge 1 ];then
            xtrabackup --prepare --target-dir=${backupDir} #预备数据
        else
            echo "可能不存在全量备份文件夹,或者文件夹里没有文件,请检查"${backupDir}
            exit 0
        fi
    else
        echo  -e "参数错误\n参数2:add为增量备份还原,nolike为差异备份还原,all为全量还原"
        exit 0
    fi
    /usr/bin/rm -rf ${mysqlDir}/* #删除mysql目录
    xtrabackup --copy-back --datadir=${mysqlDir} --target-dir=${backupDir} #执行还原
    if [ $2 = 'add' ];then
        /usr/bin/rm -rf ${incrementalBackup} #还原完删除增量备份文件夹
    elif [ $2 = 'nolike' ];then
        /usr/bin/rm -rf ${differenceBackup}/${filename} #还原完删除差异备份文件夹
    fi
    docker start ${docker_name} #启动mysql
    echo "启动mysql,修改目录权限"
    docker exec ${docker_name} chown -R mysql:mysql /var/lib/mysql/ #调整mysql目录权限
    echo "启动mysql"
    docker restart ${docker_name} #启动mysql
    echo "已经启动mysql"
else
    echo  -e "参数错误\n参数1:mysqldump为备份,mysql为还原"
fi
#结束时间
timer_end=`date "+%Y-%m-%d %H:%M:%S"`
#计算时间差
duration=`echo $(($(date +%s -d "${timer_end}") - $(date +%s -d "${timer_start}"))) | awk '{t=split("60 s 60 m 24 h 999 d",a);for(n=1;n<t;n+=2){if($1==0)break;s=$1%a[n]a[n+1]s;$1=int($1/a[n])}print s}'`
echo "开始: $timer_start"
echo "结束: $timer_end"
echo "耗时: $duration"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值