美文网首页
xtrabackup全备结合增备和恢复

xtrabackup全备结合增备和恢复

作者: CUFFS | 来源:发表于2017-02-24 14:38 被阅读253次

    增量备份和还原


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

          本文链接:https://www.haomeiwen.com/subject/ijdwwttx.html