10分钟完成MySQL物理xtrabackup增量备份

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:


在生产环境中,我们一般采取mysqldump全库备份,但这对于大型数据库是不可用的,因为mysqldump是逻辑备份,备份和恢复的效率缓慢,根据个人经验给出一个临界值的话,50G以下的数据库可以用mysqldump来进行全库备份,50G以上的数据库则需要物理全库备份,甚至是增量备份。Xtrabackup是物理备份,其备份速度也因其物理特性远超逻辑备份的速度,而且Xtrabackup就是为了逻辑备份而生的,接下来演示一下Xtrabackup是如何完成对数据库的全备和增备的。


一:首先我们安装xtrabackup软件

该tar包可自行百度下载。

1
2
3
4
5
6
7
8
9
[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

 

 

三:数据库授予备份用户相关权限

1
2
mysql >  grant
SELECT ,RELOAD,SHOW DATABASES,SUPER,LOCK TABLES,REPLICATION CLIENT,SHOW  VIEW ,EVENT,FILE  on  *.*  to  backup@ 'localhost'  identified  by  'MANAGER' ;



四:执行本文的自动化的备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
[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/mysql
MYSQL_ADMIN= /usr/local/mysql/bin/mysqladmin
BACKUP_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  "----------------------------"
echo
echo  "$0: MySQL备份脚本"
echo  "开始于: `date +%F' '%T' '%w`"
echo
  
#新建全备和差异备份的目录
mkdir  -p $FULLBACKUP_DIR
mkdir  -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_BACKUP
mkdir  -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 ] ;  then
INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP
echo  -e  "增量备份将以$INCRBASEDIR作为备份基础目录"
echo  "   "
else
INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}
echo  -e  "增量备份将以$INCRBASEDIR作为备份基础目录"
echo  "   "
fi
echo  "使用$INCRBASEDIR作为基础本次增量备份的基础目录."
$INNOBACKUPEXFULL --defaults- file =$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1
#保留一份备份的详细日志
cat  $TMPLOG> /databackup/xtrabackuplog/ $logfiledate
if  [ -z  "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`"  ] ;  then
  echo  "$INNOBACKUPEX命令执行失败:" echo
  echo  -e  "---------- $INNOBACKUPEX_PATH错误 ----------"
  cat  $TMPLOG
  rm  -f $TMPLOG
  exit  1
fi
THISBACKUP=` awk  --  "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }"  $TMPLOG`
rm  -f $TMPLOG
echo  -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_BACKUP
LATEST_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}`
echo
echo  -e  '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'  #红色
echo  -e  "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份."
echo  -e  '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'  #红色
echo
else
echo   "*********************************"
echo  -e  "正在执行全新的完全备份...请稍等..."
echo   "*********************************"
$INNOBACKUPEXFULL --defaults- file =$MY_CNF  --use-memory=4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1 
#保留一份备份的详细日志
cat  $TMPLOG> /databackup/xtrabackuplog/ $logfiledate
if  [ -z  "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`"  ] ;  then
  echo  "$INNOBACKUPEX命令执行失败:" echo
  echo  -e  "---------- $INNOBACKUPEX_PATH错误 ----------"
  cat  $TMPLOG
  rm  -f $TMPLOG
  exit  1
fi
  
THISBACKUP=` awk  --  "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }"  $TMPLOG`
rm  -f $TMPLOG
echo  -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}
echo
echo  -e  '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'  #红色
echo  -e  "无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."
echo  -e  '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'  #红色
echo
fi
#删除过期的全备
echo  -e  "find expire backup file...........waiting........."
echo  -e  "寻找过期的全备文件并删除" >> /databackup/xtrabackuplog/ $logfiledate
find  $FULLBACKUP_DIR - type  d -name  "201*"  -mtime +2|  xargs  rm  -fr {};
#删除过期的增备
echo  -e  "寻找过期的增备文件并删除"  >> /databackup/xtrabackuplog/ $logfiledate
find  $INCRBACKUP_DIR - type  d -name  "201*"  -mtime +2|  xargs  rm  -fr {};
echo
echo  "完成于: `date +%F' '%T' '%w`"
exit  0



五:验证结果

脚本执行完毕后,则会在/databackup/xtrabackup下创建两个文件夹,分别是full代表全库备份和incre增量备份

第一次执行,则创建全库备份,该脚本每天创建一分全库备份,增量备份则根据执行脚本的间隔来执行。



六:计划任务参考

这里给出一个事例仅供参考:

编辑crontab计划任务

00 */1 * * * /root/shell/xtrabackup.sh 1>/dev/null  2>&1 &


这里的意思是每一小时自动执行一次脚本,增量备份的间隔是1小时





 本文转自 dbapower 51CTO博客,原文链接:http://blog.51cto.com/suifu/1852587,如需转载请自行联系原作者


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
关系型数据库 MySQL OLAP
实时计算 Flink版产品使用合集之可以支持 MySQL 数据源的增量同步到 Hudi 吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
32 4
|
10天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
38 2
|
10天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,要实现MySQL数据源的增量同步如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
51 2
|
2天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
8天前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版产品使用合集之2.2.1版本同步mysql数据写入doris2.0 ,同步完了之后增量的数据延迟能达到20分钟甚至一直不写入如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
19 1
|
8天前
|
Prometheus Cloud Native 关系型数据库
实时计算 Flink版产品使用合集之binlog被清理掉的问题,并且binlog有备份,有什么方法来恢复到RDS
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
24 2
|
10天前
|
存储 关系型数据库 MySQL
XtraBackup支持哪些MySQL数据库版本?
【5月更文挑战第13天】XtraBackup支持哪些MySQL数据库版本?
33 0
|
10天前
|
关系型数据库 MySQL Linux
服务器Linux系统配置mysql数据库主从自动备份
这是一个基本的配置主从复制和设置自动备份的指南。具体的配置细节和命令可能因您的环境和需求而有所不同,因此建议在操作前详细阅读MySQL文档和相关资源,并谨慎操作以避免数据丢失或不一致。
28 3
|
10天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
47 0
|
10天前
|
关系型数据库 MySQL 数据管理
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
198 0