概念
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时需要通过日志将数据还原成一致的可用的数据。
数据还原
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