基于xtrabackup的数据库备份与还原脚本

#!/bin/bash
#xtrabackup完全备份+xtrabackup增量备份与还原
#2023-12-03----2023-12-08
#cjq
echo -e "\033[31m注意:\033[0m"
echo "a、你现在执行的是基于xtrabackup备份与还原脚本"
echo "b、如果在测试环境下,执行数据还原,需要删除一些库,以便观察"
echo "请选择你需要的操作编号:"
#人机交互

select i in "完全备份" "增量备份" "数据还原" "退出"
do
#定义备份目录
a="/opt/mysqlbackup/all/"
b="/opt/mysqlbackup/add/"
#备份后文件名称为日期,可以根据时间判断上一次执行是完全还是增量
c=`ls -l $a | sort -r -t " " -k 9 | awk '{print $9}' | head -n 1 | tr -d "-" | tr -d "_"`
d=`ls -l $b | sort -r -t " " -k 9 | awk '{print $9}' | head -n 1 | tr -d "-" | tr -d "_"`
#获取最新生成的文件名称
g="`ls -l $a | sort -r -t " " -k 9 | awk 'NR==1{print $9}'`/"
h="`ls -l $b | sort -r -t " " -k 9 | awk 'NR==1{print $9}'`/"
#统计增备次数
x=`ls $b | wc -l`
#创建备份目录
if [ ! -d $a ] ; then
    mkdir -p $a
fi 
if [ ! -d $b ] ; then
    mkdir -p $b
fi
#完全备份
    if [ $i ==  "完全备份" ] ; then
          innobackupex --defaults-file=/etc/my.cnf --socket=/usr/local/mysql/mysql.sock --user=root --password=123456  $a
#每次完全备份清空不需要的增备
        mv $b* /tmp/
        break
#增量备份
    elif [ $i == "增量备份" ] ; then
#判断是否为第一次增量    
        if [ $d < $c ] || [ $x == 0 ] ; then
        innobackupex --defaults-file=/etc/my.cnf --socket=/usr/local/mysql/mysql.sock --user=root --password=123456 --port=3306 --incremental $b --incremental-basedir=$a$g
        elif [ $d > $c ] && [ $x != 0 ] ; then
        innobackupex --defaults-file=/etc/my.cnf --socket=/usr/local/mysql/mysql.sock --user=root --password=123456 --port=3306 --incremental $b --incremental-basedir=$b$h

        fi
        break
#数据还原
    elif [ $i == "数据还原" ] ; then
        #准备一份全备
        innobackupex --apply-log --redo-only $a$g
        #合并增备 
        for (( h=1 ; h<=$x ; h++ ))
        do
        #最后一次增倍
            if [ $h == $x ] ; then 
                innobackupex --apply-log $a$g --incremental-dir=$b$j
                innobackupex --apply-log $a$g
                systemctl stop mysqld
                sleep 5
                mv /data/mysql/data/ /tmp/
                mkdir /data/mysql/data
                innobackupex --copy-back $a$g
                chown -R mysql:mysql /data/mysql/data/
                systemctl start mysqld
                exit 1
            fi
                j=$(ls -l $b | sort -t " " -k 9 | awk 'NR=='$h'{print $9}')
                innobackupex --apply-log --redo-only $a$g --incremental-dir=$b$j
            
        done

        break
#退出
    elif [ $i == "退出" ] ; then
        exit 1
    else 
        echo "请重新输入"
    fi
done
 

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值