xtrabackup2.4.28 部署与备份恢复脚本

xtrabackup2.4.28 部署与备份恢复
1、下载rpm 对应的安装版本 https://www.percona.com/downloads
2、安装rpm -ivh --nodeps --force percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm
3、yum 安装缺失的部分依赖 yum install percona-xtrabackup-24-2.4.28-1.el7.x86_64
4、下载rpm 依赖包安装 rpm -ivh libgcrypt11-1.4.0-15.el6.x86_64.rpm https://rpmfind.net/linux/rpm2html/search.php?query=libgcrypt.so.11(GCRYPT_1.2)(64bit)
5、规避备份版本检查报错 innobackupex -uroot -p’Ceshi@12345#’ /dbfile/bak/ --no-version-check 或者安装 yum install perl-DBD-MySQL 依赖规避
6、安装libssl.so.10 依赖,下载wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm 安装 rpm -ivh compat-openssl10-1.0.2o-3.el8.x86_64.rpm
7、压缩备份 innobackupex --defaults-file=/etc/my.cnf --user=root --password=‘xxxxxxx’ --compress --compress-threads=4 --stream=xbstream --parallel=5 -S /dbfile/data/mysqld.sock /dbfile/bak/ > /dbfile/bak/backupfull.xbstream
参数介绍:
–defaults-file:指定用于备份的.cnf配置文件
–user:备份数据库用户名
–password:备份数据库密码
–compress :表示本次备份进行压缩
–compress-threads=4 :表示启动四个线程进行压缩
–stream=xbstream : 表示使用流的方式进行压缩,并指定使用xbstream工具
–parallel=5 : 启动5个线程进行备份
-S /tmp/mysql.sock1 表示本地socket登录
最终的效果是:将文件备份到/dbfile/data目录中后,>压缩为/dbfile/data/backup.xbstream
8、解压到指定文件夹 xbstream -x < backup.xbstream -C xbjieya/
9、系统需要安装qpress软件 yum install qpress ,–decompress解压qp文件,–remove-original解压完qp文件后删除qp文件.
innobackupex --decompress --remove-original $(pwd指定的【xbjieya】)
10、准备恢复 innobackupex --apply-log xbjieya/
11、先关闭数据库 /usr/local/mysql/support-files/mysql.server stop ,备份data数据目录后,清 chown -R mysql:mysql data空data
12、执行恢复 innobackupex --copy-back xbjieya/ 后,更改xbjieya目录为data 执行chown -R mysql:mysql data
13、/usr/local/mysql/support-files/mysql.server start 启动mysql


增备执行与恢复
1、开启全备
innobackupex --defaults-file=/etc/my.cnf --user=root --password=‘xxxxxx’ -S /dbfile/data/mysqld.sock /dbfile/backuplist/
2、第一次增备
innobackupex --defaults-file=/etc/my.cnf --user=root --password=‘xxxxxx’ -S /dbfile/data/mysqld.sock --incremental /dbfile/backuplist/increment_data/ --incremental-basedir=/dbfile/backuplist/2023-12-29_11-38-21
3、再次增量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=‘xxxxxx’ -S /dbfile/data/mysqld.sock --incremental /dbfile/backuplist/increment_data/ --incremental-basedir=/dbfile/backuplist/increment_data/2023-12-29_11-44-32
4、预备恢复完整备份
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /dbfile/bak/backuplist/2023-12-29_11-38-21
5、合并第一次备份内容
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /dbfile/bak/backuplist/2023-12-29_11-38-21 --incremental-dir=/dbfile/bak/backuplist/increment_data/2023-12-29_11-44-32
6、合并第二次备份内容
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /dbfile/bak/backuplist/2023-12-29_11-38-21 --incremental-dir=/dbfile/bak/backuplist/increment_data/2023-12-29_11-49-49
7、合并第三次备份内容
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /dbfile/bak/backuplist/2023-12-29_11-38-21 --incremental-dir=/dbfile/bak/backuplist/increment_data/2023-12-29_13-44-03
8、执行恢复innobackupex --defaults-file=/etc/my.cnf --copy-back /dbfile/bak/backuplist/2023-12-29_11-38-21后更改2023-12-29_11-38-21目录为data 执行chown -R mysql:mysql data
/usr/local/mysql/support-files/mysql.server start 启动mysql


二、xtrabackup增本脚本
vim xtrabackup.sh

#!/bin/sh
# on xtrabackup 2.4.8
#确保xtrabackup 2.4.8 已部署好!!!!
# 第一次执行是会检查是否已经有全备,没有的话则进行一次全备
# 后续再执行时会根据脚本的设定来判断执行增量备份或者新的一轮全备以及增备
# 一天最多执行一次该脚本,若想同一天多次执行需要修改增量备份目录命名参数
# auth:haoyun


# 手动设置备份目标数据库的信息
mysql_info='--user=root --password=xxxxx -S /dbfile/data/mysqld.sock' #数据库账号密码设置
my_cnf='/etc/my.cnf'  #数据库配置文件位置

#设置备份存放位置信息

backup_dir=/database/backup #备份的主目录
fullbackup_dir=$backup_dir/full #全库备份目录
incrbackup_dir=$backup_dir/incr #增量备份目录
fullbackup_interver=43200  # 全库备份的间隔周期12小时,时间:秒
keep_fullbackup=2 #至少保存几个全备份库,建议保留4个

#备份过程中的日志信息存放位置
log_dir=$backup_dir/log
logfile=$log_dir/main_log.log
detaild_log=$log_dir/backup_`date +%Y-%m-%d`.log
tmp_log=$log_dir/tmplog_`date +%Y-%m-%d`.log

#检测备份目录是否存在
if [ ! -d $backup_dir ] ; then
	mkdir -p $backup_dir
	echo -e "检查到备份的主目录$backup_dir不存在,新建该主备份目录。"
fi	
if [ ! -d $fullbackup_dir ] ; then
	mkdir -p $fullbackup_dir
	echo -e "检测到全库备份目录$fullbackup_dir不存在,自行完成创建。"
fi
if [ ! -d $incrbackup_dir ] ; then
	mkdir $incrbackup_dir
	echo -e "检测到增量备份目录$incrbackup_dir不存在,自行完成创建。"
fi	
if [ ! -d $log_dir ] ; then
	mkdir $log_dir
	echo -e "检测到备份日志存放信息目录$log_dir不存在,自行完成创建。"
fi	

# 开始时间
started_time=`date +%s`
# 生成空白日志文件
touch $logfile
touch $detaild_log
#开始备份
##备份头部信息
echo -e "-----------------------------------------------------------------------------------------------------------------------------" >> $logfile
echo >> $logfile
echo -e "$0 : MySQL 备份脚本开始执行" >>$logfile
echo -e "$0 : MySQL 备份脚本开始执行"
echo -e "\e[31m 开始于: `date +%Y%m%d-%H:%M:%S` \e[m" >> $logfile
echo >> $logfile
# 查找最新的完整全备份
latest_full_backup=`find $fullbackup_dir  -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
# 查找最近完整全备份的创建时间
latest_full_backup_created_time=`stat -c %Y $fullbackup_dir/$latest_full_backup`
# 判断全备是否过期进行增量备份,如果没有备份则创建完整全备份
if [ "$latest_full_backup" -a `expr $latest_full_backup_created_time + $fullbackup_interver + 5` -ge $started_time ] ; then
# 如果最新的全备未过期则以最新的全备文件名在增量备份目录下新建目录
	echo -e "完全备份$latest_full_backup 未过期,将根据$latest_full_backup 创建增量备份基础目录名"  >> $logfile
	new_incrdir=$incrbackup_dir/$latest_full_backup
	if [ ! -d $new_incrdir ] ; then
		mkdir -p $new_incrdir
	echo "创建增量备份基础目录名$new_incrdir"
	fi
	# 查找最新的增量备份是否存在,指定一个最新备份的路径作为增量备份的基础
	latest_incr_backup=`find $new_incrdir -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`
		if [ ! $latest_incr_backup ] ; then
			#增量备份不存在,获取全备的文件夹目录名称
			firstbasedir=`find $fullbackup_dir/$latest_full_backup  -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
			incrbasedir=$fullbackup_dir/$latest_full_backup/$firstbasedir
			echo -e "增量备份将以$incrbasedir作为备份基础目录"  >> $logfile
			echo -e "增量备份不存在将以$incrbasedir作为备份基础目录"
			echo "使用$incrbasedir作为本次增量备份的基础目录开始进行备份----"   >> $logfile
			#开始执增备
        		innobackupex --defaults-file=$my_cnf --use-memory=4G $mysql_info --incremental-basedir=$incrbasedir --incremental $new_incrdir >> $tmp_log 2>&1
		else
			#增备存在,查找最新增备文件来作为下一次增备的基础
		        firstbasedir=`find ${incrbackup_dir}/${latest_full_backup}  -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
			incrbasedir=$incrbackup_dir/$latest_full_backup/$firstbasedir
			#新增备存放位置
			newincrdirtag=$incrbackup_dir/$latest_full_backup
			echo -e "增量备份将以$incrbasedir作为备份基础目录"  >> $logfile
			echo -e "增量备份已存在将以$incrbasedir作为备份基础目录"
			echo "使用$incrbasedir作为本次增量备份的基础目录开始进行备份----"   >> $logfile
                        #开始执增备
			innobackupex --defaults-file=$my_cnf --use-memory=4G $mysql_info --incremental-basedir=$incrbasedir --incremental $newincrdirtag >> $tmp_log 2>&1
		fi
 	#保留一份备份的详细日志
	cat $tmp_log > $detaild_log
	if [ -z "`tail -1 $tmp_log | grep 'completed OK!'`" ] ; then
	 echo -e " innobackupex 命令执行失败:" >> $logfile
	 echo -e "可以在$detaild_log中查看详细信息。"  >> $logfile
	 echo "					   "  >> $logfile
	 rm -f $tmp_log
	 echo -e "-------------------------------------------------------------------------------------------------------------" >> $logfile
	 exit 1
	fi
	rm -f $tmp_log 
	echo -e "数据库成功备份到:$new_incr_dir"  >> $logfile
	# 提示应该保留的备份文件起点
	res_full_backup=${fullbackup_dir}/${latest_full_backup}
	res_incre_backup=${new_incrdir}
	echo -e "\e[31m 含有增量备份,必须保留$keep_fullbackup 份全备即全备${res_full_backup}和以此全备为基础的所有增量备份即${res_incre_backup}目录中所有增量备份 \e[m" >> $logfile
	echo "				"  >> $logfile
else
	if [ ! $latest_full_backup ] ; then
		echo -e "检测到还未进行过完全备份,将创建首次完全备份"  >> $logfile
	else
		echo -e "完全备份$latest_full_backup已过期,将创建新的完全备份"  >> $logfile
	fi
	echo  "*************************************"
	echo -e "正在创建全新的完全备份目录...请稍等..."
	echo  "*************************************"
	new_fullbackup_date=`date +%Y%m%d`
	new_fullbackup_dir=$fullbackup_dir/$new_fullbackup_date
	mkdir -p $new_fullbackup_dir
	echo  "*************************************"
	echo -e "正在目录$new_fullbackup_dir下执行全新的完全备份.....请稍等....."
	echo  "*************************************"
	innobackupex --defaults-file=$my_cnf --use-memory=4G $mysql_info $new_fullbackup_dir >> $tmp_log 2>&1
	#保留一份备份的详细日志
	cat $tmp_log > $detaild_log
	if [ -z "`tail -1 $tmp_log | grep 'completed OK!'`" ] ; then
	 echo -e "innobackupex命令执行失败:" >> $logfile
	 echo -e "可以在$detaild_log中查看详细信息。"  >> $logfile
	 echo "					   "  >> $logfile
	 rm -f $tmp_log
	 echo -e "-------------------------------------------------------------------------------------------------------------" >> $logfile
	 exit 1
	fi
	rm -f $tmp_log
	echo -e "数据库成功备份到:$new_fullbackup_dir"  >> $logfile
	# 提示应该保留的备份文件起点
	latest_full_backup=`find $fullbackup_dir -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
	res_full_backup=${fullbackup_dir}/${latest_full_backup}
	echo -e "\e[31m 无增量备份,必须保留$keep_fullbackup份全备即全备${res_full_backup}. \e[m" >> $logfile
	echo "					   "  >> $logfile

fi
# 删除过期的备份文件,保留2周 
echo -e "查找过期备份文件...........waiting........."
echo -e "寻找过期的备份文件并删除" >> $logfile
efullbackupdir=`/usr/bin/find $fullbackup_dir/ -mindepth 1 -maxdepth 1 -mtime +0 -type d -print`  # 预设每周日全备,周一到周六增备
if [ ! ${efullbackupdir} ] ; then
	echo -e "\e[31m 本次未找到可以删除的过期备份文件 \e[m" >> $logfile
	echo -e "\e[31m 本次未找到可以删除的过期备份文件 \e[m" 
	echo "					   "  >> $logfile
else
	eincrbackupdir=$(basename $efullbackupdir)
	rm -rf ${efullbackupdir}
        echo "------删除过期全量备份文件夹 ${efullbackupdir}I----------"
	rm -rf ${incrbackup_dir}/${eincrbackupdir}
	echo "删除过期增量备份文件夹 ${incrbackup_dir}/${eincrbackupdir}"
	echo -e "\e[31m 已删除过期全备:${efullbackupdir}目录及文件和其对应的增量备份 \e[m" >>$logfile
	echo "					   "  >> $logfile
fi
echo -e "查找和删除过期备份文件结束"
# 本次备份结束
echo -e "\e[31m本次备份结束于: `date +'%F %T %w'` \e[m" >> $logfile
echo -e "$0:本次备份结束,可以在$logfile$detaild_log中查看本次备份信息。" >> $logfile
echo -e "$0:本次备份结束,可以在$logfile$detaild_log中查看本次备份信息。"
echo >> $logfile
echo -e "-------------------------------------------------------------------------------------------------------------" >> $logfile
echo >> $logfile
echo >> $logfile
exit 0

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值