10分钟完成MySQL物理xtrabackup增量备份
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,在生产环境中,我们一般采取mysqldump全库备份,但这对于大型数据库是不可用的,因为mysqldump是逻辑备份,备份和恢复的效率缓慢,根据个人经验给出一个临界值的话,50G以下的数据库可以用my
千家信息网最后更新 2025年02月01日10分钟完成MySQL物理xtrabackup增量备份
在生产环境中,我们一般采取mysqldump全库备份,但这对于大型数据库是不可用的,因为mysqldump是逻辑备份,备份和恢复的效率缓慢,根据个人经验给出一个临界值的话,50G以下的数据库可以用mysqldump来进行全库备份,50G以上的数据库则需要物理全库备份,甚至是增量备份。Xtrabackup是物理备份,其备份速度也因其物理特性远超逻辑备份的速度,而且Xtrabackup就是为了逻辑备份而生的,接下来演示一下Xtrabackup是如何完成对数据库的全备和增备的。
一:首先我们安装xtrabackup软件
该tar包可自行百度下载。
[root@HE3 ~]# tar xvf percona-xtrabackup-2.1.8-733-Linux-x86_64.tar.gz[root@HE3 ~]# mkdir -p /usr/local/xtrabackup[root@HE3 ~]#cp -rp percona-xtrabackup-2.1.8-Linux-x86_64/* /usr/local/xtrabackup将上述目录添加到系统环境变量[root@HE3 bin]# echo export PATH=$PATH:/usr/local/xtrabackup/bin >>/etc/profile[root@HE3 bin]# source /etc/profile[root@HE3 yum.repos.d]# yum install perl-Time-HiRes[root@HE3 bin]# yum install perl-DBD-MySQL*
二:创建备份目录
[root@HE3 ~]#mkdir -p /databackup/xtrabackup
[root@HE3 ~]#mkdir -p /databackup/xtrabackuplog
三:数据库授予备份用户相关权限
mysql > grantSELECT,RELOAD,SHOW DATABASES,SUPER,LOCK TABLES,REPLICATION CLIENT,SHOW VIEW,EVENT,FILE on *.* to backup@'localhost' identified by 'MANAGER';
四:执行本文的自动化的备份脚本
[root@HE3 ~]#vi xtrabackup.sh#backup.sh#!/bin/sh#on xtrabackup 2.1.8# 第一次执行它的时候它会检查是否有完全备份,否则先创建一个全库备份# 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全备或增量备份进行增量备份###################author rrhelei@126.com###################INNOBACKUPEX_PATH=innobackupex #INNOBACKUPEX的命令INNOBACKUPEXFULL=/usr/local/xtrabackup/bin/$INNOBACKUPEX_PATH #INNOBACKUPEX的命令路径#mysql目标服务器以及用户名和密码MYSQL_CMD="--host=localhost --user=backup --password=MANAGER --port=3306" MYSQL_UP=" --user=backup --password='MANAGER' --port=3306" #mysqladmin的用户名和密码TMPLOG="/tmp/innobackupex.$$.log"MY_CNF=/etc/my.cnf #mysql的配置文件MYSQL=/usr/local/mysql/bin/mysqlMYSQL_ADMIN=/usr/local/mysql/bin/mysqladminBACKUP_DIR=/databackup/xtrabackup # 备份的主目录FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的目录INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的目录FULLBACKUP_INTERVAL=82800 # 全库备份的间隔周期,时间:秒KEEP_FULLBACKUP=3 # 至少保留几个全库备份logfiledate=backup.`date +%Y%m%d%H%M`.txt#开始时间STARTED_TIME=`date +%s`############################################################################## 显示错误并退出#############################################################################error(){ echo "$1" 1>&2 exit 1} # 检查执行环境if [ ! -x $INNOBACKUPEXFULL ]; then error "$INNOBACKUPEXFULL未安装或未链接到/usr/bin."fi if [ ! -d $BACKUP_DIR ]; then error "备份目标文件夹:$BACKUP_DIR不存在."fi mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`if [ "$mysql_status" != "Yes" ];then error "MySQL 没有启动运行."fi if ! `echo 'exit' | $MYSQL -s $MYSQL_CMD` ; then error "提供的数据库用户名或密码不正确!"fi # 备份的头部信息echo "----------------------------"echoecho "$0: MySQL备份脚本"echo "开始于: `date +%F' '%T' '%w`"echo #新建全备和差异备份的目录mkdir -p $FULLBACKUP_DIRmkdir -p $INCRBACKUP_DIR#查找最新的完全备份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_INTERVAL + 5` -ge $STARTED_TIME ] ; then# 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录echo -e "完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份基础目录名"echo " "NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUPmkdir -p $NEW_INCRDIR# 查找最新的增量备份是否存在.指定一个备份的路径作为增量备份的基础LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`if [ ! $LATEST_INCR_BACKUP ] ; thenINCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUPecho -e "增量备份将以$INCRBASEDIR作为备份基础目录"echo " "elseINCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"echo " "fiecho "使用$INCRBASEDIR作为基础本次增量备份的基础目录."$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1#保留一份备份的详细日志cat $TMPLOG>/databackup/xtrabackuplog/$logfiledateif [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then echo "$INNOBACKUPEX命令执行失败:"; echo echo -e "---------- $INNOBACKUPEX_PATH错误 ----------" cat $TMPLOG rm -f $TMPLOG exit 1fiTHISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`rm -f $TMPLOGecho -n "数据库成功备份到:$THISBACKUP"echo# 提示应该保留的备份文件起点LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUPLATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`echoecho -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色echo -e "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份."echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色echoelseecho "*********************************"echo -e "正在执行全新的完全备份...请稍等..."echo "*********************************"$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1 #保留一份备份的详细日志cat $TMPLOG>/databackup/xtrabackuplog/$logfiledateif [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then echo "$INNOBACKUPEX命令执行失败:"; echo echo -e "---------- $INNOBACKUPEX_PATH错误 ----------" cat $TMPLOG rm -f $TMPLOG exit 1fi THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`rm -f $TMPLOGecho -n "数据库成功备份到:$THISBACKUP"echo# 提示应该保留的备份文件起点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}echoecho -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色echo -e "无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色echofi#删除过期的全备echo -e "find expire backup file...........waiting........."echo -e "寻找过期的全备文件并删除">>/databackup/xtrabackuplog/$logfiledatefind $FULLBACKUP_DIR -type d -name "201*" -mtime +2| xargs rm -fr {};#删除过期的增备echo -e "寻找过期的增备文件并删除" >>/databackup/xtrabackuplog/$logfiledatefind $INCRBACKUP_DIR -type d -name "201*" -mtime +2| xargs rm -fr {};echoecho "完成于: `date +%F' '%T' '%w`"exit 0
五:验证结果
脚本执行完毕后,则会在/databackup/xtrabackup下创建两个文件夹,分别是full代表全库备份和incre增量备份
第一次执行,则创建全库备份,该脚本每天创建一分全库备份,增量备份则根据执行脚本的间隔来执行。
六:计划任务参考
这里给出一个事例仅供参考:
编辑crontab计划任务
00 */1 * * * /root/shell/xtrabackup.sh 1>/dev/null 2>&1 &
这里的意思是每一小时自动执行一次脚本,增量备份的间隔是1小时
备份
增量
目录
全备
数据
数据库
文件
脚本
基础
命令
用户
红色
物理
密码
时间
环境
用户名
逻辑
错误
成功
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
表格和数据库
虚拟化服务器集群
武汉归春河网络技术
太仓品牌网络技术优势
前沿软件开发怎么样
违反网络安全上国外网站
网络安全审核员是干什么用的
数据库插入中文数据时报错
水域专题数据库建设方案
软件开发流程意义
服务器 除尘
网络安全理论及应用电子书
我的世界服务器补丁
梦幻2008服务器等级分布
大兴机房服务器回收价目表
服务器管理端属于控制层吗
党建网络安全横幅
mysql数据库怎么移到d盘
c 中数据库
工信部信创数据库
江苏省网络安全检查服务机构
纽奥德软件开发公司
现在软件开发用win7
做好网络安全工作建议
如何创建hive的数据库
java监控服务器端口
数据库中删除成绩记录表
系统数据库无法登录怎么办
服务器配件做固定资产
日销售统计数据库设计