xtrabackup

概念

xtrabackup是一种物理备份工具,通过协议连接到mysql服务端,然后读取并复制innodb底层的"数据块",完成所谓的"物理备份"。

支持对innodb进行热备、增量备份、差量备份。

支持对myisam进行温备,因为在备份myisam表时,会对myisam表添加读锁,而且不能对myisam表进行增量备份,每次备份myisam数据都是全量,即使名义上是增量,但是实际上仍然是全量。

 

扩展理解:

数据存放于row中,row存在于page中,page存于extent中,所以我们备份extent中的page(page是innodb引擎的最小物理存储分配单位),即可备份出对应的数据。

innodb逻辑存储结构图

xtrabackup怎样实现增量备份

每个Page都有自己的LSN号码,LSN是一个全局递增的号码,每次对page中的记录进行修改时,都会产生新的LSN号码。

假设,我们第一次备份的数据如下,所有数据由如下6个page组成,下图中的黄色方块代表page,黄色方块右上角的号码代表当前page的LSN,从下图可以看出,目前最大的LSN号码为5。

 


假设,备份完成后,我们修改了数据,而这次修改的数据存在于上图中的page C与page E中,所以,上图中的pageC与pageE的LSN就变成了6

 


如果此时要做增量备份,我们只需要备份出自上次备份以后变化的数据即可,找到LSN大于5的Page,即上图中的pageC与pageE,即可得出变化的增量数据,得出上图中的增量page后,再将增量page覆盖到上次的备份中,即可得到最新的数据。

 

安装

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 percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

全量备份

将备份的文件存放在/backup目录下

innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123123 /backup

 

备份完成后会显示 ok字样

backup-my.cnf
包含了my.cnf中备份时需要的信息。

xtrabackup_binlog_info
备份开始时二进制日志文件的"位置(position)

xtrabackup_checkpoints
备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。

 

xtrabackup_info
本次备份的概要信息

xtrabackup_logfile
记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。

 

全量备份数据还原

注意:

两个mysql版本必须一样

1、先将备份拷贝至进行还原操作的主机上
scp -r /backup/2017-04-06_21-53-13/ 192.168.1.120:/testdir/

2、事务日志应用到备份

备份出的数据并不能直接使用,因为备份出的数据是不一致的,我们还需要将同时备份出的事务日志应用到备份中,才能得到一份完整、一致、可用的数据,xtrabackup称这一步操作为prepare,也就是还原数据前的"准备"工作。

[root@master] ~$ innobackupex --apply-log 2018-03-17_07-38-21/

在事务日志容量很大的情况下,可以使用--use-memory选项加速,在不指定内存大小的情况下,默认会占用100MB的内存。

3、恢复数据

先停止数据库服务,且对应的数据目录为空。

innobackupex --datadir=/var/lib/mysql --copy-back /testdir/2017-04-06_21-53-13/

 

--datadir:指定的目录就是还原后数据要存放的目录,如果my.cnf设置了datadir,可以省略--datadir,执行copyback时会读取my.cnf中的配置,datadir目录必须为空目录。

--copy-back:对应的目录就是我们准备好的可用数据的目录。

4、设置属主属组为mysql并启动

此时我们还不能启动mysql,因为我们是使用root用户拷贝的数据,所以数据目录中的数据文件的属主属组仍然为root,我们需要将这些文件的属主属组设置为mysql。

chown -R mysql: /var/lib/mysql/

systemctl start  mariadb

增量备份

针对上次全量备份进行增量备份

 innobackupex -p123123 --incremental /backup --incremental-basedir=/backup/2017-04-08_13-36-11/

 

针对上一次增量备份做增量备份

 innobackupex -p123123 --incremental /backup --incremental-basedir=/backup/2017-04-08_13-41-59

 

增量备份数据还原

1、将所有备份拷贝至新的mysql服务器上

scp -r /backup/* 192.168.1.120:/testdir/


2、先对最开始的全量备份进行prepare工作,因为后面还有增量备份,所以此处prepare时使用--redo-only选项。

innobackupex --apply-log --redo-only --use-memory=1G /testdir/2017-04-08_13-36-11/

现在准备增量备份,如果有多个增量备份,最后一个增量之前的所有增量都可以使用类似如下命令进行prepare(唯一需要改变的就是--incremental-dir选项对应的增量目录),将当前增量prepare并合并到完全备份中,命令如下。

innobackupex --apply-log --redo-only --use-memory=1G /testdir/2017-04-08_13-36-11/ --incremental-dir=/testdir/2017-04-08_13-41-59

准备最后一个增量备份,并且合并到全量备份中。

innobackupex --apply-log --use-memory=1G /testdir/2017-04-08_13-36-11/ --incremental-dir=/testdir/2017-04-08_14-01-16

3、确认mysql服务已经停止,且对应的数据目录中没有任何文件,

systemctl stop mariadb
rm -rf /var/lib/mysql/*

4、还原,只还原最终准备好的全量备份即可

innobackupex --datadir=/var/lib/mysql --copy-back /testdir/2017-04-08_13-36-11

5、属主属组设置,并启动

chown -R mysql: /var/lib/mysql/

systemctl start mariadb

实际还原时还需要将对应的配置文件(例如my.cnf)也都还原了

 

posted @ 2018-03-17 20:17  fanren224  阅读(182)  评论(0编辑  收藏  举报