二、使用xtrabackup进行MySQL数据库备份

前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。

这时就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup

Xtrabackup实现是物理备份,而且是物理热备

Xtrabackup提供了两种命令行工具:

xtrabackup:专用于备份InnoDBXtraDB引擎的数据;

innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。

 

Xtrabackup是由percona提供的mysql数据库备份工具,特点:

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

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

(4)自动实现备份检验;

(5)还原速度快。

官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装或者下载二进制源码包。

 

1.安装xtrabackup

1下载xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz

2)解压

tar zxf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz

3)进入解压目录

cd percona-xtrabackup-2.4.4-Linux-x86_64/

4)复制bin下的所有程序到/usr/bin

[root@localhost percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/

Xtrabackup中主要包含两个工具:

xtrabackup:是用于热备份innodb, xtradb表中数据的工具,支持在线热备份,可以在不加锁的情况下备份Innodb数据表,不过此工具不能操作Myisam引擎表;
innobackupex:是将xtrabackup进行封装的perl脚本,能同时处理Innodb和Myisam,但在处理Myisam时需要加一个读锁。由于操作Myisam时需要加读锁,这会堵塞线上服务的写操作,而Innodb没有这样的限制,所以数据库中Innodb表类型所占的比例越大,则越有利。

4安装相关插件

yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 –y

5下载percona-toolkit并安装

wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm
rpm -vih percona-toolkit-2.2.19-1.noarch.rpm


安装完成xtrabackup后,就可以启动备份了。

方案一:xtrabackup完全备份+binlog增量备份

备份:

wKiom1jT4e2xwLQwAAAHb4xkQyM138.png

创建备份目录full是全备份存放的目录,inc是增量备份存放的目录。


1)完全备份

wKiom1jT4e7zkiPoAAAK4_3YUHg321.png

基本语法:# innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

/path/to/BACKUP-DIR/指定备份所存放的目标目录,备份过程会创建一个以当时备份时间命名的目录存放备份文件。

注:

 --defaults-file=/etc/my.cnf 指定mysql的配置文件my.cfg,如果指定则必须是第一个参数

--database指定要备份的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB 数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)

 

出现如下提示表示成功

wKioL1jT4kDT28AEAAAIM62LVyY128.png


备份后的文件:

在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件:

MySQL备份与恢复(二)_第1张图片

各文件说明:

1xtrabackup_checkpoints备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

每个InnoDB(通常为16k大小)都会包含一个日志序列号,即LSNLSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

2xtrabackup_binlog_infomysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

3xtrabackup_binlog_pos_innodb二进制日志文件及用于InnoDBXtraDB表的二进制日志文件的当前position

4xtrabackup_binary备份中用到的xtrabackup的可执行文件;

5backup-my.cnf备份命令用到的配置选项信息;

 

注意:备份数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

mysql> create user 'fjc'@'localhost' identified by '123456';
mysql> revoke all privileges,grant option from 'fjc'@'localhost';
mysql> grant reload,lock tables,replication client, process on *.* to 'fjc'@'localhost';
mysql> flush privileges;
至此全备完全成功,然后向mysql某个库插入几条数据,然后进行增量备份

模拟数据库修改:

MySQL备份与恢复(二)_第2张图片


2)增量备份二进制文件:

wKioL1jT4kDBI3WlAAAJfgzdC-U012.png

查看完全备份时binlog日志位置(position)


MySQL备份与恢复(二)_第3张图片

增量备份二进制文件


还原:

wKioL1jT4kGB8KjmAAAHL8_oL10935.png

模拟数据库损坏这里直接使用删除数据目录文件来模拟损坏。

(1)准备(prepare)一个完全备份

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不回滚到xtrabackup刚开始时的点。

innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:

wKiom1jT4kGB266kAAAIGi-d5s8404.png

注:

/opt/mysqlbackup/full/2017-03-22_02-10-57/备份文件所在目录名称

--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。

 

(2)还原数据库

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。如下面的命令:

wKioL1jT4kKCZHqDAAAIF-X2hf8318.png


MySQL备份与恢复(二)_第4张图片

当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。

 

重启动MySQL,并验证还原后的数据:

MySQL备份与恢复(二)_第5张图片


3)还原增量备份:

MySQL备份与恢复(二)_第6张图片

为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原


MySQL备份与恢复(二)_第7张图片

重新启动二进制日志并验证还原数据验证数据是否恢复回来


方案二xtrabackup完全备份+xtrabacup增量备份

前面我们进行增量备份时,使用的还是老方法:备份二进制日志。其实xtrabackup还支持进行增量备份。

先介绍下xtrabackup的备份原理:

InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件(transaction log,事务日志)。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

xtrabackup在启动时会记住log sequence numberLSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来这就是xtrabackup的备份过程

所以每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础。

xtraBackup基于InnoDBcrash-recovery功能。它会复制innodbdata file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。

InnoDB启动的时候,它会先去检查data filetransaction log,并且会做二步操作:

1.It applies committed transaction log entries to the data files

2.it performs an undo operation on any transactions that modified data but did not commit.

所以在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery

 

备份:

这里还针对之前测试环境进行备份和还原。

1)完全备份

MySQL备份与恢复(二)_第8张图片

-defaults-file指定数据库的配置文件,如果使用该参数必须做为第一个参数;

--user指定连接数据库的用户名;--password指定连接数据库的密码;

--port指定连接数据库的端口号;

--backup 实施备份到target-dir;

 --target-dir=name 备份文件的存放目录路径

--database指定要备份的数据库,指定的数据库只对MyISAM表和InnoDB表的表结构有效,对于InnoDB 数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)

/opt/mysqlbackup/full/是备份文件的存放位置。


wKioL1jT5JfzwJS0AAAKUUmecxs642.png

备份完成后部分信息如上。


MySQL备份与恢复(二)_第9张图片

查看完全备份文件

 

(2)增量备份

第一次增量备份

MySQL备份与恢复(二)_第10张图片

录入一行数据


MySQL备份与恢复(二)_第11张图片

执行备份命令

--incremental-basedir指定上次完整备份或者增量备份文件的位置(即如果是第一次增量备份则指向完全备份所在目录,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录)


MySQL备份与恢复(二)_第12张图片

查看增量备份文件

注:

这里的增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。


第二次增量备份

MySQL备份与恢复(二)_第13张图片

录入一行数据


MySQL备份与恢复(二)_第14张图片

执行备份命令

注:第二次增量备份--incremental-basedir指向上一次增量备份文件的位置


MySQL备份与恢复(二)_第15张图片

查看增量备份文件

 

恢复

MySQL备份与恢复(二)_第16张图片

这里直接删除了tb1

1)完整备份恢复

MySQL备份与恢复(二)_第17张图片

注意:在进行恢复前,如果完整备份在远程主机上,首先将完整备份复制到本地主机上,如果是tar包,则需要先解包,解包命令为:tar izxf xxx.tar,这里必须使用-i参数(忽略存档中的 0 字节块(通常意味着文件结束))


2)恢复到第一次增量的时刻

MySQL备份与恢复(二)_第18张图片

    增量备份恢复的步骤和完整备份恢复的步骤基本一致,只是应用日志的过程稍有不同。增量备份恢复时,是先将所有的增量备份挨个应用到完整备份的数据文件中,然后再将完整备份中的数据恢复到数据库中。


3)恢复到第二次增量备份前面

MySQL备份与恢复(二)_第19张图片


4)恢复整个库

MySQL备份与恢复(二)_第20张图片


5)善后工作

MySQL备份与恢复(二)_第21张图片

关闭数据库

开始rsync数据文件


MySQL备份与恢复(二)_第22张图片

当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。


验证

MySQL备份与恢复(二)_第23张图片


方案三:innobackupex全库备份+innobackupex增量备份

备份

1)完全备份

MySQL备份与恢复(二)_第24张图片

执行以上命令,之后查看完全备份文件:

MySQL备份与恢复(二)_第25张图片


2)第一次增量备份

MySQL备份与恢复(二)_第26张图片

录入一行数据


MySQL备份与恢复(二)_第27张图片

执行备份命令,之后查看备份文件:

MySQL备份与恢复(二)_第28张图片


3)第二次增量备份

MySQL备份与恢复(二)_第29张图片

插入一行数据


MySQL备份与恢复(二)_第30张图片

执行备份命令,之后查看备份文件:

MySQL备份与恢复(二)_第31张图片


恢复

MySQL备份与恢复(二)_第32张图片

这里同样删除了tb1

1)恢复全备份

wKiom1jT5x3z84qDAAALARBc33I575.png

--redo-only 用于准备增量备份内容把数据合并到全备份目录,配合incremental-dir 增量备份目录使用


2)基于全备份进行第一次增量备份的恢复

MySQL备份与恢复(二)_第33张图片


3)基于全备份和第一次增量备份,恢复第二次增量备份

MySQL备份与恢复(二)_第34张图片


4)善后工作

MySQL备份与恢复(二)_第35张图片

停止数据库

空数据目录下所有文件


MySQL备份与恢复(二)_第36张图片

将恢复好的数据按照配置文件的需求拷贝到相应目录


MySQL备份与恢复(二)_第37张图片

修改数据文件的属性

启动mysql服务,并验证,发现数据都回来了。

 

附:Xtrabackup的“流”及“备份压缩”功能

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如:

innobackupex --user=root --password="123456" --stream=tar /opt/mysqlbackup/full/ | gzip > /opt/mysqlbackup/full/full_`date +%F_%H%M%S`.tar.gz