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

发布时间:2024年01月13日

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

文章来源:https://blog.csdn.net/2301_81851878/article/details/135464322
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。