Xtrabackup备份与恢复

一、Xtrabackup介绍

Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具

xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下:

(1)xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;

(2)innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份

二、Xtrabackup优点

(1)备份速度快,物理备份可靠

(2)备份过程不会打断正在执行的事务(无需锁表)

(3)能够基于压缩等功能节约磁盘空间和流量

(4)自动备份校验

(5)还原速度快

(6)可以流传将备份传输到另外一台机器上

(7)在不增加服务器负载的情况备份数据

三、xtrabackup的安装部署以及备份恢复实现


1、xtrabackup的安装

可以选择rpm包方式安装,也可以下载源码包编译安装

官网地址:Percona Software Downloads

#yum:
#安装percona依赖库
yum install <https://repo.percona.com/yum/percona-release-latest.noarch.rpm>
#查看可安装版本
yum list | grep percona-xtrabackup
# 5.6、5.7安装24的
yum install -y percona-xtrabackup-24
# 8.0安装80的
yum install -y percona-xtrabackup-80
​
#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 
rpm -qa |grep xtrabackup
percona-xtrabackup-24-2.4.9-1.el7.x86_64
​
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:  
   --host     指定主机
   --user     指定用户名
   --password    指定密码
   --port     指定端口
   --databases     指定数据库
   --incremental    创建增量备份
   --incremental-basedir   指定包含完全备份的目录
   --incremental-dir      指定包含增量备份的目录   
   --apply-log        对备份进行预处理操作             
     一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录
 
 
 
装完xtrabackup后,生成以下几个工具
[root@localhost bin]# ./xb
xbcloud        xbcloud_osenv  xbcrypt        xbiff          xbrlapi        xbstream
 
xbcloud和xbcloud_osenv是xtrabackup新的高级特性:云备份;
xbcrypt也是新的特性,加密备份集;
xbstream是xtrabackup的流数据功能,通过流数据功能,可将备份内容打包并传给管道后的压缩工具进行压缩;
xtrabackup是主程序;
innobackupex在以前是一个perl脚本,会调用xtrabackup这个二进制工具,从xtrabackup 2.3开始,该工具使用C语言进行了重写,当前它是xtabackup二进制工具的一个软连接,但是实际的使用方法却不同,并且在以后的版本中会删除该工具。

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_checkpoints -- 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:
 
每个InnoDB页(通常为16k大小)
都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
 
(2)xtrabackup_binlog_info  --  mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。
 
(3)xtrabackup_binlog_pos_innodb  --  二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
 
(4)xtrabackup_binary  --  备份中用到的xtrabackup的可执行文件;
 
(5)backup-my.cnf  --  备份命令用到的配置选项信息:
 
在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份

2、xtrabackup全量备份与恢复

全量备份:

备份:
innobackupex --defaults-file=/etc/my.cnf --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/
#比如我/path/to/BACKUP-DIR/指定:/home/dpan/mysql/bak
#生成目录为:/home/dpan/mysql/bak/2022-05-06_17-53-17

可能存在的报错:

xtrabackup: Error: --defaults-file must be specified first on the command line
​
#--defaults-file=/etc/my.cnf参数必须写在最前面

全量恢复:

注意:恢复不用启动mysql,mysql需要关闭状态

如果B库要恢复A库的备份,则需要B库删除原有的数据,例如:/usr/local/mysql/data

配置my.cnf的数据目录路径,否则会报错,需要和A一致

#一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。
​
#innobackupex命令的--apply-log选项可用于实现上述功能,如下面的命令:
​
恢复:
innobackupex --apply-log /home/dpan/mysql/bak/2022-05-06_17-53-17
innobackupex --copy-back   /home/dpan/mysql/bak/2022-05-06_17-53-17
​
#completed OK!  #看到completed OK就是恢复正常了
#ll /home/dpan/mysql/data/ ##根据实际data路径填写,在B上查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改
​
chown mysql:mysql /home/dpan/mysql/data/ #根据实际data路径填写
​
systemctl start mysqld #启动mysql
​
mysql -uroot -p -e "show databases;"  #查看数据,是否恢复
​
[root@localhost test]# mysql -usimple -p -e "show databases;"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

3、xtrabackup增量备份与恢复

暂时没有实际需求,等有需求再实践