打赏

星辰大海ゞ

That which does not kill us makes us stronger!

导航

Xtrabackup安装及使用

官方安装步骤:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

安装percona repo源

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

yum install xtrabackup

物理备份

------------------------------------------------------------------------------------------------------------

xtrabackup增量备份的原理是:             

1)、首先完成一个完全备份,并记录下此时检查点LSN;

2)、然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。

 

简介:
    Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
    Xtrabackup有两个主要的工具:xtrabackup、innobackupex
  (1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  (2)innobackupex 则封装了 xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
  (3)使用帮助:http://www.percona.com/docs/wiki/percona-xtrabackup:start

  
   
4、备份并打包压缩
      innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --database=zztx --stream=tar /data/back_data/ 2>/data/back_data/zztx.log | gzip     1>/data/back_data/zztx.tar.gz
     
      说明:
      --database=zztx 单独对zztx数据库做备份 ,若是不添加此参数那就那就是对全库做备份
      2>/data/back_data/zztx.log  输出信息写入日志中
      1>/data/back_data/zztx.tar.gz 打包压缩存储到该文件中
     
      此处可以写个脚本做备份(backup.sh)
      #!/bin/sh
      echo "开始备份..."`date`
      log=zztx01_`date +%y%m%d%H%M`.log
      str=zztx01_`date +%y%m%d%H%M`.tar.gz
      innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --database=zztx --stream=tar /data/back_data/ 2>/data/back_data/$log | gzip 1>/data/back_data/$str
      echo "备份完毕..."`date`
     
5、恢复数据
      1) 先停止数据库:service mysqld stop
      2) 解压 tar -izxvf zztx.tar.gz -C /data/back_data/db/   (没有db ,需要mkdir /data/back_data/db/) 
      3) 恢复 innobackupex --user=root --password --defaults-file=/etc/my.cnf  --apply-log /data/back_data/db/  (--apply-log选项的命令是准备在一个备份上启动mysql服务)
              innobackupex --user=root --password --defaults-file=/etc/my.cnf  --copy-back /data/back_data/db/  (--copy-back 选项的命令从备份目录拷贝数据,索引,日志到my.cnf文   件里规定的初始位置。)
      4) 赋权 chown -R mysql.mysql /var/lib/mysql/*
      5) 重启数据库 service mysqld restart
      6) 删除垃圾 cd /var/lib/mysql/  && rm xtrabackup*
      进入数据库查看,一切OK~

 -------------------------------------------------------------

http://www.mike.org.cn/articles/xtrabackup-guide/

 一、Xtrabackup介绍

A、Xtrabackup是什么

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表 2、innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。 3、官方文档:http://www.percona.com/docs/wiki/percona-xtrabackup:start

B、Xtrabackup可以做什么

在线(热)备份整个库的InnoDB、 XtraDB表 在xtrabackup的上一次整库备份基础上做增量备份(innodb only) 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:

(1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。 (2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。

首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。

因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

C、Xtrabackup备份原理

XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。

InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:

XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。

在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery。

D、实现细节

XtraBackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行XtraBackup的用户,必须对innodb的数据文件具有读写权限。之所以采用read-write模式是因为XtraBackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。

XtraBackup要从文件系统中复制大量的数据,所以它尽可能地使用posix_fadvise(),来告诉OS不要缓存读取到的数据,从而提升性能。因为这些数据不会重用到了,OS却没有这么聪明。如果要缓存一下的话,几个G的数据,会对OS的虚拟内存造成很大的压力,其它进程,比如mysqld很有可能被swap出去,这样系统就会受到很大影响了。

在备份innodb page的过程中,XtraBackup每次读写1MB的数据,1MB/16KB=64个page。这个不可配置。读1MB数据之后,XtraBackup一页一页地遍历这1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。在复制transactions log的时候,每次读写512KB的数据。同样不可以配置。

 

二.Xtrabackup的备份与恢复使用

A、Xtrabackup常用参数选项如下:

--defaults-file=# 默认配置文件的路径,如果不带参数,xtrabackup将从依次从以下位置查找配置文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并读取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只需要指定datadir、 innodb_data_home_dir、 innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6个参数即可让xtrabackup正常工作。  

--defaults-extra-file=# 如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件  

--target-dir=name 备份文件的存放目录路径  

--backup 实施备份到target-dir  

--prepare 实施对备份文件进行恢复前的准备(生成InnoDB log file)  

--print-param 打印备份或恢复时需要的参数  

--use-memory=# 该参数在 prepare 的时候使用,控制prepare时innodb实例使用的内存量  

--suspend-at-end 在target-dir目录下产生一个xtrabackup_suspended文件,将xtrabackup进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除xtrabackup_suspended文件  

--throttle=# 每秒IO次数,限制backup时使用的I/O操作量,使备份对数据库正常业务的影响最小化  

--log-stream 该参数在backup的时候使用,将xtrabackup_logfile的内容输出到标准输出,使用该参数时会自动使用suspend-at-end参数,innobackupex脚本的stream 模式会使用该参数。  

--incremental-lsn=name 增量备份时只拷贝LSN比该参数指定值新的ibd pages,前次备份到了哪个LSN可以看前次备份集的xtrabackup_checkpoints文件  

--incremental-basedir=name 该参数在backup的时候使用,备份比该参数指定位置的备份集新的idb pages  

--incremental-dir=name 该参数在prepare的时候使用,指定prepare时产生的.delta 文件和日志文件的存放路径  

--tables=name 在备份file-per-table类型的数据文件时使用,使用正则表达式指定需要备份的innodb表  

--datadir=name MySQL数据库的数据文件目录。

B、普通备份方式

a)普通备份(全量备份)

mkdir -p /data0/backup/mysql xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/ cp -r  /data0/mysql/data/testinnodb/ /data0/backup/mysql/

注意:xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以这里要手动备份一下,以便xtrabackup恢复的时候使用。

全量备份恢复

实施对备份文件进行恢复前的准备

xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare  --target-dir=/data0/backup/mysql/

从备份目录复制对应数据库表结构到默认的数据目录

cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

删除默认数据目录中对应的数据文件并复制备份的数据文件到默认数据目录

rm /data0/backup/mysql/ib* cp /data0/backup/mysql/ib*  /data0/mysql/data/

修改数据目录权限

chown -R mysql:mysql /data0/mysql/data

重启MySQL  

/data0/mysql/mysql restart

b)增量备份

增量备份优点:

1、数据库太大没有足够的空间全量备份,作增量备份有效节省空间,且效率高。 2、支持热备份。备份过程不锁表,不受时间限制,不影响用户使用。 3、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。 4、备份恢复基于文件操作,降低直接对数据库操作风险。 5、备份效率更高,恢复效率更高。

这个我研究N久没成功,原因暂时还没找到。我测试环境的Mysql版本是5.5.11的,xtrabackup_55是根据MySQL5.5.9的源码编译的,不知道和这个有关系没?待验证!这里只把实现步骤整理出来。

增量备份及模拟恢复步骤:

先做一次全量备份,增量备份需要以此为基础

#建立备份目录 mkdir -p /data0/backup/mysql/base

#建立一个全量备份

xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/base

#生成的备份数据文件

ls /data0/backup/mysql/base/

ibdata1  xtrabackup_checkpoints  xtrabackup_logfile

#备份数据库表结构 cp -r  /data0/mysql/data/testinnodb/ /data0/backup/mysql/

以此全量备份为基础进行增量备份

#建立备份目录 mkdir -p /data0/backup/mysql/delta

#建立一个增量备份

xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --backup  --target-dir=/data0/backup/mysql/delta  --incremental-basedir=/data0/backup/mysql/base

#生成的备份数据文件 ls /data0/backup/mysql/delta/ ibdata1.delta  xtrabackup_checkpoints  xtrabackup_logfile

注:在增量备份目录下,数据文件都是以.delta结尾的。增量备份只备份上一次全量备份后被修改过的page,所以增量备份只暂用较少的空间。增量备份可以在增量备份的基础上增量。增量备份目录每次都需修改的。比如第二次增量就改成/data0/backup/mysql/delta2)

增量备份恢复过程:

首先需要分别对全量、增量备份各做一次prepare操作。

xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base

xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base --incremental-dir=/data0/backup/mysql/delta/

从备份目录复制对应数据库表结构到默认的数据目录

cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

删除默认数据目录中对应的数据文件并复制备份的数据文件到默认数据目录

rm /data0/backup/mysql/ib* cp /data0/backup/mysql/ib*  /data0/mysql/data/

修改数据目录权限

chown -R mysql:mysql /data0/mysql/data

重启MySQL

/data0/mysql/mysql restart

四、innobackupex的备份与恢复使用

A、数据备份

通常一般都直接使用innobackupex,因为它能同时备份InnoDB和MyISAM引擎的表。要注意的是my.cnf里datadir这个参数是必须要指定的,xtrabackup_55是根据它去定位innodb数据文件的位置。

备份前首先所需要建立一个备份所需的目录

mkdir -p /data0/backup/mysql

1、普通全备  

可以通过--defaults-file=/usr/local/mysql/etc/my.cnf 指定配置文件位置

innobackupex  --database="testinnodb test" --user=root  --password=''123"  --no-lock    /backup   2>/tmp/mysqlbackup.log

    增量备份

innobackupex  --database="XXXX"  --user=root  --password=''123" --incremental  /backup/  --incremental-basedir=/backup/2015-09-10_01-33-33 (上一次的全备目录)

innobackupex  --database="XXXX"  --user=root  --password=''123" --incremental  /backup/  --incremental-basedir=/backup/2015-09-10_01-44-44(上一次增量备份目录)

innobackupex  --database="XXXX"  --user=root  --password=''123" --incremental  /backup/  --incremental-basedir=/backup/2015-09-10_01-55-55(上一次增量备份目录)

 

注:使用mysql的root用户将数据库testinnodb和test的备份。备份成功后会在该目录下将创建以时间戳为名称的备份目录。no-lock参数用于指定备份时不锁定表。2>/tmp/mysqlbackup.log是将备份过程中的输出信息保存到/tmp/mysqlbackup.log中。

2、打包备份  

innobackupex  --database="testinnodb test"  --user=root --password=''123"   --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log 1>/data0/backup/mysql/mike.tar

注:这种备份时间会比较长,主要是执行压缩操作。这种方式打的包需要使用tar izxvf解压。参数-i是必须加上的。

3、压缩备份

innobackupex  --database="testinnodb test"  --user=root    --no-lock --stream=tar  /data0/backup/mysql/ 2>/tmp/innobackup.log|gzip>/data0/backup/mysql/mike.tar.gz

4、备份到远程服务器

备份当前机器下的数据到192.168.1.101的/data0/目录下。

innobackupex  --database="testinnodb test"  --user=root --password=''123"    --no-lock --stream=tar  /data0/backup/mysql/|ssh root@192.168.1.101  cat ">"/data0/backup.tar

B、数据恢复

以压缩后的备份数据为例,普通备份和打包备份的恢复方法和这个类似,就不在举例了。

解包备份数据

tar xvzfi  mike.tar.gz

指定恢复备份所需的xtrabackup_logfile文件的目录,

首先全备恢复的准备:

 

--use-memory选项   preparing进程可以通过分配更多的内存来提高速度,这取决于系统的可用内存,默认值是100MB。总的来说分配的内存越多越好。

 

innobackupex --apply-log --redo-only  --no-lock --use-memory=1G  /backup/2015-09-10_01-33-33

--apply-log : 表名将日志文件应用到全备份文件

--redo-only  表名仅仅是redo log 文件 ,这个参数最好加上

其次第一次增量备份恢复的准备:    (此处目录路径必须要使用绝对路径,否则报错

innobackupex --apply-log --redo-only  --no-lock  /backup/2015-09-10_01-33-33  --incremental-dir=/backup/2015-09-10_01-44-44

其次第二次增量备份恢复的准备:  (依次推进)

innobackupex --apply-log --redo-only  --no-lock  /backup/2015-09-10_01-33-33  --incremental-dir=/backup/2015-09-10_01-55-55

 

此处注意:恢复mysql备份文件要保证datadir文件夹为空,否则会报如下的错误:

innobackupex: Error: Original data directory '/var/lib/mysql' is not empty! at /usr/bin/innobackupex line 2113.

所以接下来停止mysql服务清空data文件夹(此处为/var/lib/mysql),或者跳过下一步的 --copy-back 操作 ,直接手动把相应文件夹复制到data文件夹下

 

 

因为增量备份的数据都已合并到完全备份中去了,所以此时只恢复完全备份即可

innobackupex --copy-back  --no-lock   /backup/2015-09-10_01-33-33

修改数据目录权限

chown -R mysql:mysql /data0/mysql/data

重启MySQL

/data0/mysql/mysql restart

 

五、参考资料:

http://blog.51yip.com/mysql/1650.html

----------------------------------------------------------------- 

[root@gzy 2014-02-17_01-09-48]# cat xtrabackup_checkpoints 
backup_type = full-backuped   # 表示备份类型为完全备份
from_lsn = 0                  # LSN号从0开始
to_lsn = 5618613              # LSN号到5618613结束
last_lsn = 5618613            # 最后的lsn号,换句话说,一会进行增量备份时会以这个数字开始,可以理解为xtrabackup为每次备份打的开始和结束的标记
compact = 0                   # 0表示未启用压缩

posted on 2015-08-19 17:04  星辰大海ゞ  阅读(1045)  评论(1编辑  收藏  举报