xtrabackup全备结合增备和恢复

增量备份和还原


增量备份是为了减少空间使用和备份的时间;增量备份的实现,依赖于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还原备份

你可能感兴趣的:(xtrabackup全备结合增备和恢复)