日期:2014-05-16  浏览次数:20427 次

xtrabackup 增量备份和部分备份
㈠ 增量备份

原理:
① 首先进行0级备份,记录此时LSN
② 当进行1级备份时,比较表空间中每个页的LSN是否大于0级备份的LSN,如果是,则备份该页,并记录当前的LSN
0级备份完,xtrabackup会在备份保存点下的xtrabackup_checkpoints文件里记录一个to_lsn值,该值是备份结束后全库的LSN
下面是0级备份的一个简单例子:
$ xtrabackup --backup --target-dir=/home/mysql/backup
到/home/mysql/backup目录下查看xtrabackup_checkpoints文件,大概会有如下类似信息:
[mysql@even backup]$ cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 2674772512

接着可以做1级备份:
$ xtrabackup --backup --target-dir=/home/mysql/delta --incremental-basedir=/home/mysql/backup
在/home/mysql/delta下,大概会有*.ibd.delta和ibdata1.delta文件,这些表示从to_lsn = 2674772512之后有变化
如果检查/home/mysql/delta下的/home/mysql/delta文件,会有如下类似信息:
[mysql@even delta]$ cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2674772512
to_lsn = 2674772512

都有to_lsn值,这会增量的迭代做了基础

在--prepare阶段,增量备份和普通的备份存在差异
对于普通的备份,已提交的事务通过备份的数据文件利用日志中的变化信息去重演这个变化的过程,而未提交的会被回滚
对于增量备份,在--prepare阶段,必须跳过未提交事务的回滚,因为它们在下一次增量备份时可能会被提交
所以,应该使用--apply-log-only来阻止未提交事务的回滚,如果你不那么做的话,增量备份可能会变成无效
若是事务被回滚掉,则下一次的增量备份将无法应用

假定你做了一次0级和2次增量备份,目录如下:
/data/backups/base
/data/backups/inc1
/data/backups/inc2
那么为了阻止事务的回滚,你应该:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
这步完成,即使跳过事务回滚,你的备份也算是有效的,如果此时恢复MySQL,InnoDB会在后台做崩溃恢复,并告知你上次未正常关库而已
运用第一次增量备份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
运用第二次增量备份:
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
在运用最后一次增量备份时,我们把--apply-log-only略去了,也只有在最后一次增量--prepare时才可以省略
因为我们没有必要把这个回滚解析交给服务器去做,这只会增加Server的压力,但即使--apply-log-only,备份仍然是一致的



㈡ 部分备份

当innodb_file_per_table打开时,xtrabackup支持部分备份,有2种方式:--tables和--tables-file 
我本人不喜欢--tables,比较麻烦,需要正则表达式匹配和考虑OS转义符还有BASH命令长度,巨蛋疼
主要把要备份的表写到一个文件里面即可,每个表一行
例如,我只想备份employees库下面的employees和departments这2个表
$ xtrabackup --backup --tables-file=/tmp/t.TXT --target-dir=/home/mysql/backup
需要注意的是,--tables-file指定的文件只能放在/tmp下,估计是xtrabackup工具内部写死的关系

但是在--prepare时你将会收到一个类似下面的错误:

131011 14:05:24  InnoDB: Error: trying to open a table, but could not
InnoDB: open the tablespace file './employees/dept_emp.ibd'!
InnoDB: It will be removed from data dictionary.

这是因为这些表载xtrabackup内置的InnoDB数据字典中存在,但相应的.ibd不存在


参考文章:
http://www.percona.com/doc/percona-xtrabackup/2.1/


By 迦夜
2013-10-11 
Learn bearish some things,is their best protection