zoukankan      html  css  js  c++  java
  • xtrabackup

    概念

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

    全量备份数据还原

    注意:

    两个mysql版本必须一样

    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

    增量备份

    针对上次全量备份进行增量备份

     innobackupex -p123123 --incremental /backup --incremental-basedir=/backup/2017-04-08_13-36-11/

    针对上一次增量备份做增量备份

     innobackupex -p123123 --incremental /backup --incremental-basedir=/backup/2017-04-08_13-41-59

    增量备份数据还原

    1、将所有备份拷贝至新的mysql服务器上

    scp -r /backup/* 192.168.1.120:/testdir/


    2、先对最开始的全量备份进行prepare工作,因为后面还有增量备份,所以此处prepare时使用--redo-only选项。

    innobackupex --apply-log --redo-only --use-memory=1G /testdir/2017-04-08_13-36-11/

    现在准备增量备份,如果有多个增量备份,最后一个增量之前的所有增量都可以使用类似如下命令进行prepare(唯一需要改变的就是--incremental-dir选项对应的增量目录),将当前增量prepare并合并到完全备份中,命令如下。

    innobackupex --apply-log --redo-only --use-memory=1G /testdir/2017-04-08_13-36-11/ --incremental-dir=/testdir/2017-04-08_13-41-59

    准备最后一个增量备份,并且合并到全量备份中。

    innobackupex --apply-log --use-memory=1G /testdir/2017-04-08_13-36-11/ --incremental-dir=/testdir/2017-04-08_14-01-16

    3、确认mysql服务已经停止,且对应的数据目录中没有任何文件,

    systemctl stop mariadb
    rm -rf /var/lib/mysql/*

    4、还原,只还原最终准备好的全量备份即可

    innobackupex --datadir=/var/lib/mysql --copy-back /testdir/2017-04-08_13-36-11

    5、属主属组设置,并启动

    chown -R mysql: /var/lib/mysql/

    systemctl start mariadb

    实际还原时还需要将对应的配置文件(例如my.cnf)也都还原了

  • 相关阅读:
    C++ sort()函数的用法
    对C++里面 的知识积累:
    codevs 1160
    hdu 1020 Encoding
    poj 2591 Set Definition
    hdu 1505,1506
    hdu 1284 钱币兑换
    hdu 1231 最大连续子序列 ,1003 Max Sum;
    尺取法
    android OTA package packing and extract to partition
  • 原文地址:https://www.cnblogs.com/fanren224/p/8592446.html
Copyright © 2011-2022 走看看