10分钟完成MySQL物理xtrabackup增量备份
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,在生产环境中,我们一般采取mysqldump全库备份,但这对于大型数据库是不可用的,因为mysqldump是逻辑备份,备份和恢复的效率缓慢,根据个人经验给出一个临界值的话,50G以下的数据库可以用my
千家信息网最后更新 2024年11月22日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安全错误
数据库的锁怎样保障安全
网络安全检察建议
微信支付音箱老是服务器断开
软件开发发布论坛
联通服务器
壁挂式边缘计算服务器收费标准
诸暨租房软件开发
软件开发过程中的项目管理
网络安全协议太低
电脑服务器电源键坏了怎么修
求购软件开发
xml如何导入SQL数据库
软件开发公司经营许可证
能通天下网络技术有限 公司
asp连接数据库文件
APP网络安全行业
考研数据库技术培训
阿里云 vpn服务器搭建
电脑开机显示服务器管理器
郑州软件开发小公司
金融软件开发公司这么难
软件开发知识脉络
hbac网络安全
极玩致乐网络技术有限公司官网
守牢网络安全防线
数据库应用技术课后习题答案
加强网络安全防范 电脑锁屏
最新内网服务器管理
计算机网络安全基础会计第六版
诊断策略服务器在哪里
淘宝软件开发店铺推荐