💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨
💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️
💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖
今天作为PXB系列的第三篇,这篇文章其实计划是在上周写的,奈何工作上的事情过于繁忙,就迟迟一直抽不出身来专注写作,不过,正所谓“好饭不怕晚”,今天难得下午有时间来兑现我的承诺,将这篇期待已久的文章呈现在大家面前,如标题所示今天带来的是——Percona XtraBackup标准化全库完整备份策略。
删过库跑过路的小伙伴都知道有备份是多么的重要😄,全库备份将作为最后的恢复手段。不是执行一个xtrabackup备份命令就完事了,xtrabackup备份需要备份哪些内容,xtrabackup输出的备份片名称应该怎么命名这些都是非常有讲究的,不能执行了一个全库备份命令,生成的备份没有命名,而是xtrabackup自己内部命名的,这让一个刚上手的小伙伴会感觉的很蒙蔽,不知道应该从那个备份开始恢复。所以今天就带着这些疑问开始今天的内容吧。
用一篇文章是不能将Percona XtraBackup工具讲明白的,所以我将理论、命令、备份策略、异机恢复、使用场景等分成五篇去介绍,即使分为五篇也有部分内容没有涵盖到,但是这五篇文章都是精华,掌握了之后就可以轻松应对Percona XtraBackup工具的相关日常工作了,五篇文章的内容分别如下:
- 第一篇:Percona XtraBackup物理备份工具的基础理论概述
- 第二篇:Percona XtraBackup工具备份指南:常用备份命令详解与实践(当前篇)
- 第三篇:Percona XtraBackup标准化全库完整备份策略
- 第四篇:Percona XtraBackup全量+mysqlbinlog增量完成异机恢复:基于全库恢复 or 基于时间点恢复
- 第五篇:物理克隆数据clone插件、逻辑备份工具mysqldump/mysqlpump和物理备份工具Percona XtraBackup这三种的区别和各自的使用场景总汇
xtrabackup备份应该哪些内容:
- 备份内容一:参数文件。MySQL启动的第一步就是读取参数文件中的内容,备份他有多重要那么就不言而喻了。
- 备份内容二:数据库对象、共享表空间(ibdata)、临时表空间(ibtmp)、undo文件。在MySQL中没有控制文件这个概念,所以读取完参数文件后,就开始打开数据库对象、共享表空间(ibdata)、临时表空间(ibtmp)、undo文件。备份他有多重要那么就不言而喻了。
- 备份内容三:二进制日志。二进制日志记录mysql所有的DDL和DML(除了数据查询语句select)语句事件。用来记录数据库中发生的修改情况,数据的修改、表的创建及修改等。它既可以记录涉及修改的SQL,也可以记录数据修改的行变化记录,同时也记录了执行时间。类似于oracle的归档日志,二进制有可能会被重做日志替代(自己的猜测哦😁)。备份他有多重要那么就不言而喻了
上面我说了三个重要,所以xtrabackup备份少了那一个都不行滴!
xtrabackup全库备份脚本:包括数据文件(数据库对象、共享表空间(ibdata)、临时表空间(ibtmp)、undo文件)、参数文件
Date=`date +%Y%m%d`
Begin=`date +"%Y-%m-%d %H:%M:%S"`
Port=3306
# 实例压缩备份(恢复时需要借助qpress-11-linux-x64.tar解压缩工具,备份时不需要)
/mysql/app/mysql/bin/xtrabackup/bin/xtrabackup --defaults-file=/mysql/data/3306/my.cnf --socket=/mysql/data/3306/mysql.sock --user=root --password=123456 --no-lock --backup --compress --compress-threads=2 --target-dir=/mysql/backup/full/xtrabackup_full_${Port}_${Date} --parallel=2 2> /mysql/backup/logs/xtrabackup_full_${Port}_${Date}_err.log
#copy备份参数文件
cp /mysql/data/3306/my.cnf /mysql/backup/full/backup-my.cnf_${Port}_${Date}
find /mysql/backup/logs/ -name "xtrabackup_*_${Port}_*_err.log" -mtime +14 -exec rm -rf {} \;
find /mysql/backup/full/ -name "xtrabackup_*_${Port}_*" -mtime +14 -exec rm -rf {} \;
find /mysql/backup/full/ -name "backup-my.cnf_${Port}_*" -mtime +14 -exec rm -rf {} \; ### -mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。
二进制日志备份脚本:增量备份二进制日志(增量:只copy上次备份时没有的二进制日志)
BinLogDir=/mysql/log/3306/binlog ###二进制目录日志(实际路径,定义在my.cnf文件中)
BinIndexFile=/mysql/log/3306/binlog/itpuxdb-binlog.index ###二进制索引输出路径(实际文件,定义在my.cnf文件中)
Date=`date +%Y%m%d`
Port=3306
BinLogBakDir=/mysql/backup/binlog ###备份二进制日志的路径
LogOutFile=/mysql/backup/logs/backup_mysql_binlog_${Port}_${Date}.log ###日志信息
NextLogFile=`tail -n 1 $BinIndexFile`
LogCounter=`wc -l $BinIndexFile |awk '{print $1}'` ###统计索引二进制文件数量
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
echo "--------------------------------------------------------------------" >> $LogOutFile
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Start... >> $LogOutFile
for binfile in `cat $BinIndexFile`
do
base=`basename $binfile`
#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $LogCounter ]
then
echo $base skip! >> $LogOutFile
else
dest=$BinLogBakDir/$base
if(test -e $dest)
#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
then
echo $base exist! >> $LogOutFile
else
cp $BinLogDir/$base $BinLogBakDir
echo $base copying >> $LogOutFile
fi
fi
done
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Complete! Next LogFile is: $NextLogFile >> $LogOutFile
find /mysql/backup/logs -name "backup_mysql_binlog_${Port}_*.log" -mtime +14 -exec rm -rf {} \;
find $BinLogBakDir -name "*binlog.**" -mtime +14 -exec rm -rf {} \; ###清理14天前的备份的binlog日志
案例一:对MySQL实例进行xtrabackup全库备份。保留4份xtrabackup完整备份,14天的二进制日志备份
一、数据备份的路径规划:
[root@mysql1 ~]# mkdir -p /mysql/backup/full [root@mysql1 ~]# mkdir -p /mysql/backup/logs [root@mysql1 ~]# mkdir -p /mysql/backup/binlog [root@mysql1 ~]# mkdir -p /mysql/backup/script ###full(mysqldump全备的数据)、script(备份脚本)、binlog(需要打开binlog日志功能)、logs(备份日志) [root@mysql1 ~]# chown -R mysql:mysql /mysql/backup/
二、xtrabackup全备脚本
[root@mysql1 ~]# cd script/
[root@mysql1 ~]# vi xtrabackup_full_3306.sh
Date=`date +%Y%m%d`
Begin=`date +"%Y-%m-%d %H:%M:%S"`
Port=3306
# 实例压缩备份(恢复时需要借助qpress-11-linux-x64.tar解压缩工具,备份时不需要)
/mysql/app/mysql/bin/xtrabackup/bin/xtrabackup --defaults-file=/mysql/data/3306/my.cnf --socket=/mysql/data/3306/mysql.sock --user=root --password=123456 --no-lock --backup --compress --compress-threads=2 --target-dir=/mysql/backup/full/xtrabackup_full_${Port}_${Date} --parallel=2 2> /mysql/backup/logs/xtrabackup_full_${Port}_${Date}_err.log
#copy备份参数文件
cp /mysql/data/3306/my.cnf /mysql/backup/full/backup-my.cnf_${Port}_${Date}
find /mysql/backup/logs/ -name "xtrabackup_*_${Port}_*_err.log" -mtime +14 -exec rm -rf {} \;
find /mysql/backup/full/ -name "xtrabackup_*_${Port}_*" -mtime +14 -exec rm -rf {} \;
find /mysql/backup/full/ -name "backup-my.cnf_${Port}_*" -mtime +14 -exec rm -rf {} \; ### -mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。
三、binlog日志增量脚本(增量:只copy上次备份时没有的二进制日志)
[root@mysql1 ~]# cd script/
[root@mysql1 ~]# vi backup_mysql_binlog_3306.sh
BinLogDir=/mysql/log/3306/binlog ###二进制目录日志(实际路径,定义在my.cnf文件中)
BinIndexFile=/mysql/log/3306/binlog/itpuxdb-binlog.index ###二进制索引输出路径(实际文件,定义在my.cnf文件中)
Date=`date +%Y%m%d`
Port=3306
BinLogBakDir=/mysql/backup/binlog ###备份二进制日志的路径
LogOutFile=/mysql/backup/logs/backup_mysql_binlog_${Port}_${Date}.log ###日志信息
NextLogFile=`tail -n 1 $BinIndexFile`
LogCounter=`wc -l $BinIndexFile |awk '{print $1}'` ###统计索引二进制文件数量
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
echo "--------------------------------------------------------------------" >> $LogOutFile
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Start... >> $LogOutFile
for binfile in `cat $BinIndexFile`
do
base=`basename $binfile`
#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $LogCounter ]
then
echo $base skip! >> $LogOutFile
else
dest=$BinLogBakDir/$base
if(test -e $dest)
#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
then
echo $base exist! >> $LogOutFile
else
cp $BinLogDir/$base $BinLogBakDir
echo $base copying >> $LogOutFile
fi
fi
done
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Complete! Next LogFile is: $NextLogFile >> $LogOutFile
find /mysql/backup/logs -name "backup_mysql_binlog_${Port}_*.log" -mtime +14 -exec rm -rf {} \;
find $BinLogBakDir -name "*binlog.**" -mtime +14 -exec rm -rf {} \; ###清理14天前的备份的binlog日志
四、在root下添加全备脚本和binlog增量脚本的自动计划任务
[root@lf script]# chmod 775 /mysql/backup/script/*.sh --确保root用户有执行权限
[root@lf script]# crontab -e
#xtrabackup_3306_full
00 23 * * 1,5 /mysql/backup/script/xtrabackup_full_3306.sh ###每周一和周五执行一次全备,保留4份
#mysql_3306_binlog
00 02 * * * /mysql/backup/script/backup_mysql_binlog_3306.sh ###每天凌晨进行归档全备,保留14天
五、Root下测试脚本可用性,并查看日志
全备:
[root@lf script]# /mysql/backup/script/xtrabackup_full_3306.sh [root@lf logs]$ tail -2000f /mysql/backup/logs/xtrabackup_full_3306_20240710_err.log
增量:
[root@mysql1 script]# /mysql/backup/script/backup_mysql_binlog_3306.sh [root@mysql1 binlog]# tail -200f /mysql/backup/logs/backup_mysql_binlog_3306_20240710.log
关于PXB标准化全库完整备份策略到这里就算完成了,淦了1个半小时,目前也就不到7千字,虽然字数不多,但是对于需要通过xtrabackup做备份策略的小伙伴而言是非常有用的一篇文章,当然备份策略也需要随着业务的发展而不断优化和调整,打造出最适合业务的备份方案。
最后,感谢每一位集帅的阅读和支持。如果在备份过程中遇到了任何问题或有任何宝贵的建议,欢迎随时与我交流分享。