目录
一、背景
二、思考过程
2.1 离线安装与在线安装
2.2 全量备份与增量备份
2.3 开发过程
三、步骤
3.1 xtrabackup的离线安装
3.1.1 安装前提
3.1.2 安装包下载
3.1.3 把 Percona-XtraBackup-2.4.22-rc99a781-el7-x86_64-bundle.tar移动到/tmp 并解压
3.1.4安装percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm 报错
3.1.5 挂载CentOS镜像 作为yum仓库
3.1.6 安装依赖包
3.1.7 依赖包安装完成后直接安装xtrabackup安装包
3.2使用xtrabackup备份mysql
3.3使用xtrabackup恢复数据
3.3.1 xtrabackup恢复前提
3.3.2 xtrabackup全量恢复准备
3.4 恢复完成后更改mysql 数据文件的权限并重启MYSQL库
3.5 xtrabackup实战
3.5.1 项目上使用的架构图
3.5.2 实际项目中定时任务
3.5.3 三个脚本
四、总结
一、背景
在项目运行的mysql备份时,以前没有遇到数据量特别大的库,最大的也就是几千万条,mysqldump 备份完了,再source恢复到新的库中,这种方法一直很实用。直到这个新项目的数据库,数据量是亿级起步的,而且各业务部门推数据的定时任务非常多,mysqldump对数据库进行备份时,出现了运行了两天都没跑完的情景。于是,紧急研究一下xtrabackup这个快速的热备份。
二、思考过程
2.1 离线安装与在线安装
由于到目前为止,mysql基本都是网络上物理隔绝的服务器,所以本文档只提供离线安装方式,在线的请自行简化。
2.2 全量备份与增量备份
xtrabackup能同时提供全量备份和增量备份两种方式,但是由于实际数据库运行中,增量备份的方式,在宕机的情形下需要从历史的最早的全量开始,逐个备份恢复,浪费的时间和精力会更多,所以,本文不去研究如何进行增量,而着重于全量备份。
2.3 开发过程
从一台机器打通备份到恢复的流程,再增加scp传输数据,传数据中等待,使用标识文件来确定传输是否完成。
三、步骤
3.1 xtrabackup的离线安装
3.1.1 安装前提
Linux已安装,mysql已安装
需求软件包:lib.rpm/系统对应iso镜像文件/xtrabackup安装包
3.1.2 安装包下载
注意安装包与MYSQL版本的对应关系,5.7以上8.0,其余2.4
/downloads/
3.1.3 把 Percona-XtraBackup-2.4.22-rc99a781-el7-x86_64-bundle.tar移动到/tmp 并解压
cd /tmp#解压缩tar xvfPercona-XtraBackup-2.4.22-rc99a781-el7-x86_64-bundle.tar
3.1.4安装percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm 报错
rpm -ivh percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
3.1.5 挂载CentOS镜像 作为yum仓库
这里需要提前把CentOS的镜像文件上传到服务器上去
#挂载镜像文件mount CentOS-7-x86_64-DVD-1511.iso -o loop /mnt#备份老的yum仓库配置cd /etc/yum.repos.d/mkdir oldmv * old/#修改yum仓库的来源cd /etc/yum.repos.d/vi mnt.repo#把下面这段帖进去[mnt]name=mntbaseurl=file:///mntgpgcheck=0enabled=1#然后:wq保存退出#使yum仓库配置生效cd /etc/yum.repos.d/#清理yum仓库配置yum clean all#使新的yum仓库配置生效yum makecache
(出现下图所示元数据缓存已建立,yum仓库配置成功)
3.1.6 安装依赖包
yum -y install libaio* libc* libcrypt* libdl* libgcc_s*
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum -y install rsync perl l perl-Digest-MD5
cd /tmprpm -ivh libev-4.04-2.el6.x86_64.rpm
3.1.7 依赖包安装完成后直接安装xtrabackup安装包
#安装xtrabackupcd /tmprpm -ivh percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
#查看是否ok:innobackupex -vwhich xtrabackup
出现上图 安装完成!
3.2使用xtrabackup备份mysql
#前提是mysql 正常运行中service mysql status
返回running为正常
#开始备份,执行以下命令innobackupex --user=root --password=root /backup/backup_0527
出现completed OK就完成了。整个备份3秒左右(70M的一个库),可以按照这个比例来推断你的生产库多大,会有多长时间。
3.3使用xtrabackup恢复数据
3.3.1 xtrabackup恢复前提
首先关闭数据库
service mysql stop
然后进入数据库路径删除对应的文件 路径与( /etc/f)一致
cd /var/lib/mysql
3.3.2 xtrabackup全量恢复准备
#不使用增量恢复的原因有二,一是增量恢复需要历史上每一个片段都正确,二是意外宕机会造成数据丢失,手工恢复麻烦。
#“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态
3.3.3 xtrabackup全量恢复
#执行以下命令innobackupex --defaults-file=/etc/f --copy-back /backup/backup_0527/-05-27_19-46-23/
看到complete就完成了
3.4 恢复完成后更改mysql 数据文件的权限并重启MYSQL库
#进入MYSQL data路径pwd#MYSQL文件路径 更换拥有者权限给MYSQLchown -R mysql:mysql *#启动MYSQL服务service mysql start
此时可以使用navicat查看数据了。
以上整个流程纯属单机操作,下面我们来看实际项目中,如何在服务器之间做备份
3.5 xtrabackup实战
3.5.1 项目上使用的架构图
三台机器:
第一台机器121负责备份到本地
第二台机器68负责存储10天以上的备份(如果有9天的空间放6天的数据,1:1.5冗余量)
第三台机器69负责恢复当天的数据,如果第一台121宕机,直接作为当前数据库。
3.5.2 实际项目中定时任务
121-68;68-69分别做免密登录,免密的方法这里就不介绍了,自行百度
121:
10 0 * * * sh /backup/backup_all.sh
68:
10 0 * * * sh /backup/backup_all2.sh
69:
10 0 * * * sh /backup/backup_all3.sh
三条机器同时定在凌晨00:10开始调度。
3.5.3 三个脚本
实际运行的三个脚本会比下面提供的要长,主要涉及到日期的选择、数据的备份与删除、日志的写入等信息。下面仅仅保留一些 主干部分,避免文档过长。中间根据运行状态自己去看情况加报错判断,这里就不一一提供了。
3.5.3.1 backup_all.sh备份到本地:
#清理当天和昨天的数据、日志last_1date=$(date -d"1 day ago $date" +%Y%m%d)rm -rf /backup/backup_$last_1daterm -rf /backup/backup_$date#备份数据innobackupex --defaults-file="/etc/f" --host="localhost" --port=【端口号】--user="【账号名】" --password="【密码】" /backup/backup_$date#传输数据scp -r /backup/backup_$date 【用户名】@【备份机器68的IP地址】:/backup#传输完传标记文件通知下一台机器开始echo `date -d today +"%Y-%m-%d %T"`' 开始传输标记文件'echo `date -d today +"%Y-%m-%d %T"`' 0' > /backup/finished_$datescp -r /backup/finished_$date 【用户名】@【备份机器68的IP地址】:/backup
3.5.3.2 backup_all2.sh传输到第三台机器
#判断文件/backup/finished_$date是否到达,否则等5MIN再轮训while [ ! -f "/backup/finished_$date" ]do# 休眠30秒echo `date -d today +"%Y-%m-%d %T"`'休眠300秒,等文件来finished_'$datesleep 300doneecho `date -d today +"%Y-%m-%d %T"`' 文件finished_'$date'已到达,准备传送数据文件到69服务器'#检测到了就执行传输scp -r /backup/backup_$date【用户名】@【备份机器69的IP地址】:/backup#传输完传标记文件通知下一台机器开始echo `date -d today +"%Y-%m-%d %T"`' 开始传输标记文件'scp -r /backup/finished_$date 【用户名】@【备份机器69的IP地址】:/backup
3.5.3.3 backup_all3.sh恢复到第三台机器
#等待新的标志文件到达,开始备份数据while [ ! -f "/backup/finished_$date" ]do# 休眠30秒echo `date -d today +"%Y-%m-%d %T"`'休眠300秒,等文件来finished_'$datesleep 300doneecho `date -d today +"%Y-%m-%d %T"`'文件finished_'$date'已到达,开始恢复数据'#获取当天生成的备份文件路径newdatadir=' /backup/backup_'$date'/'`ls /backup/backup_$date`'/'echo $newdatadir#停止mysql服务 删除路径/sbin/service mysql stoprm -rf 【MYSQLdata路径】/*#恢复数据准备echo `date -d today +"%Y-%m-%d %T"`' 恢复数据准备'innobackupex --defaults-file=/etc/f --user=【账号】 --password=【密码】 --use-memory=8G --apply-log $newdatadir#正式恢复数据echo `date -d today +"%Y-%m-%d %T"`' 正式恢复数据开始'innobackupex --defaults-file=/etc/f --user=【账号】 --password=【密码】 --copy-back $newdatadir#数据恢复完成后,更改文件权限chown -R mysql:mysql 【MYSQLdata路径】/*
定时执行这3个脚本,则数据就可以源源不断的备份到第二台机器,并且在第三台恢复到MYSQL。
四、总结
文中提到的xtrabackup的备份已经经过了验证,并且在项目中实际使用,服务器状况:16U64G服务器,Mysql库中568G数据备份耗时48分钟左右,加上两次传输,和备份库恢复实际运行时间约2.5小时。
本文中所用到的文件有(只要有一台WINDOWS机器,有下面这些文件就可以自己搭环境做实验):
CentOS-7-x86_64-DVD-1511.iso
libev-4.04-2.el6.x86_64.rpm
mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
Percona-XtraBackup-2.4.22-rc99a781-el7-x86_64-bundle.tar
以及虚拟机软件
提供一站式永久网盘链接:
链接:/s/108gDM80vacO4HpKfBkpIjA
提取码:1024
五、后续
其他数据库比如Oracle使用的一些小技巧,比如Hive一些简单的优化方法,后面在实际工作中使用到,可以分享出来给大家。
投稿人:绿竹翁 验证人:绿竹翁 编 辑:Viky Wu
如果觉得《基于xtrabackup的Mysql快速备份与恢复》对你有帮助,请点赞、收藏,并留下你的观点哦!