#!/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