概念
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)也都还原了