增量备份和还原
增量备份是为了减少空间使用和备份的时间;增量备份的实现,依赖于innodb页上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。增量备份会复制指定LSN之后的所有数据页。
创建增量备份
创建全备
在创建增量备份之前需要一个全备,不然增量备份是没有意义的,--no-timestamp选项不会在备份目录下面创建以时间命名的子文件夹
$ innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/fulldata
或者
$ innobackupex --host=127.0.0.1 --user=root --password=newpass --port=3306 \
--socket=/var/lib/mysql/mysql.sock /home/xtarback/fulldata
这样就会在/home/xtarback/fulldata/下创建一个时间戳文件夹,如 /home/xtarback/fulldata/2017-02-24_09-39-18,然后文件夹内是备份文件。
检查备份文件夹下的xtrabackup-checkpoints,会有一下信息:
[root@localhost 2017-02-24_09-39-18]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 3693629
last_lsn = 3693629
compact = 0
recover_binlog_info = 0
[root@localhost 2017-02-24_09-39-18]#
创建第一个增量备份
- 增加一张incremental01的表sql如下
CREATE TABLE incremental01 (
name VARCHAR(50) NULL DEFAULT NULL,
tpye VARCHAR(50) NULL DEFAULT NULL,
commond VARCHAR(600) NULL DEFAULT NULL
)
ENGINE=InnoDB
;
增加如下数据
REPLACE INTO incremental01 (name, tpye, commond) VALUES ('incremental01', 'incremental', 'innobackupex --incremental -u root -p newpass /home/xtarback/incremental/ --incremental-basedir=/home/xtarback/fulldata/2017-02-24_09-39-18');
然后使用--incremental创建增量备份 --incremental-basedir=name --incremental-dir=name
$ innobackupex --incremental /home/xtarback/incremental/ --incremental-basedir=BASEDIR
[root@localhost 2017-02-24_09-39-18]# innobackupex --incremental -u root -p newpass \
/home/xtarback/incremental/ --incremental-basedir=/home/xtarback/fulldata/2017-02-24_09-39-18
BASEDIR指向之前的全备, /home/xtarback/fulldata/2017-02-24_09-39-18,成功后备份会生成在/home/xtarback/incremental/下的时间戳目录中,如:/home/xtarback/incremental/2017-02-24_10-01-47 ,把这个目录叫为记为 INCREMENTAL-DIR-1方面之后使用。
然后查看xtrabackup-checkpoints:
[root@localhost 2017-02-24_10-01-47]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3693629
to_lsn = 3734903
last_lsn = 3734903
compact = 0
recover_binlog_info = 0
_#和全备的lsn对比发现,全备从0-3693629,而第一次增量备份是基于全备的,所有记录的lsn从3693629-3734903_
[root@localhost 2017-02-24_10-01-47]# cat /home/xtarback/fulldata/2017-02-24_09-39-18/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 3693629
last_lsn = 3693629
compact = 0
recover_binlog_info = 0
[root@localhost 2017-02-24_10-01-47]#
可以发现和全备不同的是,backup_type为incremental,from_lsn不为0。
基于第一个增量备份创建第二个增量备份
在INCREMENTAL-DIR-1的基础上再创建一个增量备份,记为INCREMENTAL-DIR-2。
- 增加incremental02表并输入数据
CREATE TABLE `incremental02` (
`name` VARCHAR(50) NULL DEFAULT NULL,
`tpye` VARCHAR(50) NULL DEFAULT NULL,
`commond` VARCHAR(600) NULL DEFAULT NULL
)
ENGINE=InnoDB
;
增加如下数据
REPLACE INTO incremental02
(name
, tpye
, commond
) VALUES ('incremental02', 'incremental', 'innobackupex --incremental -u root -p newpass /home/xtarback/incremental/ --incremental-basedir=/home/xtarback/incremental/2017-02-24_10-01-47');
- 第二次增量备份
$ innobackupex --incremental /data/backups --incremental-basedir=INCREMENTAL-DIR-1
[root@localhost 2017-02-24_10-11-28]# innobackupex --incremental -u root -p newpass \
/home/xtarback/incremental/ --incremental-basedir=/home/xtarback/incremental/2017-02-24_10-01-47
备份完成在/home/xtarback/incremental目录下面新增以时间戳的子目录如:/home/xtarback/incremental/2017-02-24_10-11-28
然后查看xtrabackup-checkpoints:
#第二次增备
[root@localhost 2017-02-24_10-11-28]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3734903
to_lsn = 3739279
last_lsn = 3739279
compact = 0
recover_binlog_info = 0
[root@localhost 2017-02-24_10-11-28]#
#第一次增备
[root@localhost 2017-02-24_10-01-47]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3693629
to_lsn = 3734903
last_lsn = 3734903
compact = 0
recover_binlog_info = 0
#全备
[root@localhost 2017-02-24_10-01-47]# cat /home/xtarback/fulldata/2017-02-24_09-39-18/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 3693629
last_lsn = 3693629
compact = 0
recover_binlog_info = 0
[root@localhost 2017-02-24_10-01-47]#
增量备份替代方法
可以使用指定—incremental-lsn来代替—incremental-basedir的方法创建增量备份。
innobackupex --incremental /data/backups --incremental-lsn=3734903 #第一次增量备份时基于全备的last_lsn
innobackupex --incremental /data/backups --incremental-lsn=3693629 #第二次增量备份时基于第一次增备的last_lsn
注意:xtrabackup只会影响xtradb或者innodb的表,其他引擎的表在增量备份的时候只会复制整个文件,不会差异。
汇总信息
备份类型 | 备份目录 | lsn范围 |
---|---|---|
full-backuped | /home/xtarback/fulldata/2017-02-24_09-39-18 | 0-3693629 |
incremental01 | /home/xtarback/incremental/2017-02-24_10-01-47 | 3693629-3734903 |
incremental02 | /home/xtarback/incremental/2017-02-24_10-11-28 | 3734903-3739279 |
预备增量备份
预备增量备份需要2个步骤:
1.需要先预备全备,但是只重做已提交事务,不回滚未提交事务,然后应用到全备,也是只重做已提交事务,不回滚未提交事务
2.回滚未提交事务
如果已经回滚了未提交事务,那么就无法再应用增量备份。
注:在mariadb 10.0 上测试发现不加—redo-only预备全备,然后使用 –redo-only应用增量备份,mysql服务能够正常启动并且数据被成功还原
在全备上,使用—redo-only只做已提交事务,不回滚未提交事务
innobackupex --apply-log --redo-only /home/xtarback/fulldata/2017-02-24_09-39-18
会出现以下结果:
InnoDB: Doing recovery: scanned up to log sequence number 3693629 (0%)
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3693638
InnoDB: Number of pools: 1
170224 10:31:57 completed OK!
应用第一个增量备份
innobackupex --apply-log --redo-only /home/xtarback/fulldata/2017-02-24_09-39-18 --incremental-dir=/home/xtarback/incremental/2017-02-24_10-01-47
输出结果,注意LSN的变化: 全备下面的xtrabackup_checkpoints记录发生了改变
[root@localhost 2017-02-24_10-11-28]# cat /home/xtarback/fulldata/2017-02-24_09-39-18/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 3734903
last_lsn = 3734903
compact = 0
recover_binlog_info = 0
综合之前的记录,全备的last_lsn从3693629变成了第一次增备的last_lsn 3734903
如果没有指定--incremental-dir,那么innobackupex会使用最近的一个在basedir中被创建的子目录。
应用另外一个备份
innobackupex --apply-log /home/xtarback/fulldata/2017-02-24_09-39-18 --incremental-dir=/home/xtarback/incremental/2017-02-24_10-11-28
InnoDB: Shutdown completed; log sequence number 3739823
170224 10:42:28 completed OK!
[root@localhost 2017-02-24_09-39-18]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 3739279
last_lsn = 3739279
compact = 0
recover_binlog_info = 0
[root@localhost 2017-02-24_09-39-18]#
因为是最后一个增量备份所以没有必要再加—redo-only,这样最后一个增量也被应用到全备上了。
注:--redo-only除了最后一个不用加之外,其他的增量应用都要加,最后一个应用的时候可以直接进入回滚未提交事务阶段。如果加了也没事儿,服务启动的时候会进入recovery过程,来回滚
需要注意的是,应用增量备份的时候只能按照备份的顺序来应用。如果应用顺序错误,那么备份就不可用。如果无法确定顺序,可以使用xtrabackup-checkpoints来确定顺序。
回滚未提交事务
当应用完所有增量备份的时候,就需要回滚所有未完成事务(如果最后一步加了 –redo-only就需要回滚未提交,不执行的话在服务启动阶段服务会处理未提交事务)。
innobackupex --apply-log /home/xtarback/fulldata/2017-02-24_09-39-18
Note that the iblog* files will not be created by innobackupex, if you want them to be created, use xtrabackup –prepareon the directory. Otherwise, the files will be created by the server once started.
注:
文中提到innodb事务日志(iblog)不会被创建,但是测试下使用了最后一步回滚未提交事务发现有iblog文件,而且上文提到 innobackupex会隐式执行两次 xtrabackup –prepare,在下文介绍xtrabackup时会提到,执行2次xtrabackup –preare会创建iblog*文件,与文中提到不符。
还原增量备份
- 现在删除第一次增量备份和第二次增量备份的表执行还原操作
mysql> drop table incremental01;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table incremental02;
Query OK, 0 rows affected (0.01 sec)
还原增量备份其实和还原全备一样
innobackupex --copy-back /home/xtarback/fulldata/2017-02-24_09-39-18
注意事项可以看:使用innobackupex还原备份