Xtrabackup的安装与备份还原
一、Xtrabackup介绍
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。
Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
二、Xtrabackup优点
(1)备份速度快,物理备份可靠
(2)备份过程不会打断正在执行的事务
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动备份校验
(5)还原速度快
(6)可以流传将备份传输到另外一台机器上
(7)在不增加服务器负载的情况备份数据
三、Xtrabackup备份原理

(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
(5)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
四、xtrabackup的安装部署
下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/
下载:percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
解压缩 将目录移动到指定位置:
tar -zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
mv percona-xtrabackup-2.4.9-Linux-x86_64 /usr/local/percona-xtrabackup
创建软连接:
ln -s /usr/local/percona-xtrabackup/bin/innobackupex /usr/bin/innobackupex
导入环境变量:
echo "export PATH=$PATH:/usr/local/percona-xtrabackup/bin" >> /etc/profile
source /etc/profile
全备:mysqlFullBackup.sh
#!/bin/bash
backupDir=/data/Backup/db/full/`date +%F`
mkdir -p ${backupDir}
/usr/bin/innobackupex --user=root --password="dbpassword" --use-memory=128M --no-timestamp ${backupDir}
echo `date +%F` > /tmp/Date.txt
增量:mysqlIncBackup.sh
#!/bin/bash
backupDir=/data/Backup/db/increment/`date +%F`
baseDir=`cat /tmp/Date.txt`
mkdir -p ${backupDir}
/usr/bin/innobackupex --user=root --password="dbpassword" --use-memory=128M --no-timestamp --incremental --incremental-basedir=/data/Backup/db/full/${baseDir} ${backupDir}
添加定时任务:
# function:full backup mysql
30 00 * * 06 /bin/sh /server/scripts/mysqlFullBackup.sh > /dev/null 2>&1
# function:increment backup mysql
30 00 * * 0-5 /bin/sh /server/scripts/mysqlIncBackup.sh > /dev/null 2>&1
五、xtrabackup的全量和增量恢复
在还原的时候,如果我们的主机没有做主备,这里推荐找一台空的数据库进行还原,避免生产环境数据丢失或者损坏。
可以选择rpm包方式安装,也可以下载源码包编译安装,这里直接采用rpm包的方式进行安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
安装完成后,开始备份还原。
还原前的准备:
1.)空的数据库 删除数据库data路径下的所有文件
2.)准备好之前全备和增量备份的目录
3.)保证备份与还原的my.cnf中的数据库备份路径一致
全量还原:
#首先,关停要恢复服务器的mysql
/etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
#拷贝全备目录
scp -r /backup/2021-03-06 root@192.168.10.85:/backup/
#删除新数据库上原有的数据
rm -rf /data/mysqldata/data/
#配置my.cnf的数据目录路径,否则会报错,要和原有的一致
datadir=/data/mysqldata/data
#恢复数据
innobackupex --copy-back /backup/2021-03-06
180729 23:32:03 innobackupex: Starting the copy-back operation
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!"
.....
180729 23:32:08 completed OK!
看到completed ok 就是恢复正常了!
总结全库备份与恢复三步曲:
a. innobackupex全量备份,并指定备份目录路径;
b. 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;
c. 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径
增量还原:
增量还原和全量基本差不多,唯一不同的是需要把增量的部分合并到全量中。
1.)将全量2021-03-06和增量2021-03-07 拷贝只要备份的服务器目录下
2.)合并全备数据目录,确保数据的一致性
innobackupex --apply-log --redo-only /backup/2021-03-06
3.)将增量备份数据合并到全备数据目录当中
innobackupex --apply-log --redo-only /backup/2021-03-06/ --incremental-dir=/backup/2021-03-07/
4.)恢复数据
innobackupex --copy-back /backup/2021-03-06
5.)连续增量还原时:
2024-06-01 from_lsn=0 to_lsn=全备的末端
第一次增量还原:
innobackupex --apply-log --redo-only 2024-06-01/ --incremental-dir=/root/2024-06-02
2024-06-02 还原后 2024-06-01 from_lsn=0 不变 to_lsn会变成2024-06-02的to_lsn
第二次增量还原:
innobackupex --apply-log --redo-only 2024-06-01/ --incremental-dir=/root/2024-06-03
2024-06-03 还原2024-06-01时,2024-06-03的from_lsn 需要修改成01的to_lsn
后续2024-06-04依次类推,from_lsn修改成第一次全备的to_lsn
最后恢复全备目录2024-06-01
innobackupex --copy-back 2024-06-01
最后注意mysql/data目录的权限
总结:
(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;
(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;
(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;
(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。
(5)还原后,如果数据库启动失败,(报错信息:The innodb_system data file 'ibdata1' must be writable) 检查data目录权限,删除ib_logfile1和ib_logfile0这两个文件。

浙公网安备 33010602011771号