Xtrabackup与innobackupex热备份MySQL数据

一.Xtrabackup 简介及备份原理说明:

    Xtrabackup是由percona开发的一个开源软件,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此软件可以说是innodb热备工具ibbackup的一个开源替代品

  Xtrabackup中包含两个工具:

  1、xtrabackup:用于热备份innodb,xtradb引擎表的工具,不能备份其他表。

  2、innobackupex:对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。

  Xtrabackup可以做什么

  1、在线(热)备份整个库的InnoDB, XtraDB表

  2、在xtrabackup的上一次整库备份基础上做增量备份(innodb only)

  3、以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

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

  (1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。

  (2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。

  在Xtrabackup的wiki上简单的介绍了一下实现的原理:

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

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

  Tip1:Xtrabackup是一个用于备份InnoDB/XtrDB的工具,真正的在线备份(不影响数据的读写),InnoDB Hot Backup的开源替代品。

  Tip2:在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

  备份原理

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

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

  1.It applies committed transaction log entries to the data files

  2.it performs an undo operation on any transactions that modified data but did not commit.

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

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

  实现细节

  文件权限

  xtrabackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。

为什么要用rw模式呢?直接read模式不好么?因为xtrabackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。

  Tuning the OS Buffers

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

  posix_fadvise(file,0,0, POSIX_FADV_DONTNEED)

  而且XtraBackup在读取数据的时候还尽可能地预读:

  posix_fadvise(file,0,0, POSIX_FADV_SEQUENTIAL)

  复制数据文件

  在备份innodb page的过程中,XtraBackup每次读写1MB的数据,1MB/16KB=64个page。

这个不可配置。读1MB数据之后,XtraBackup一页一页地遍历这1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。

  It skips this check on the doublewrite buffer??

  在复制transactions log的时候,每次读写512KB的数据。同样不可以配置。


二.下载及安装配置

  1. Xtrabackup二进制64位下载地址:

  http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6/Linux/binary/x86_64/

  2.MySQL5.1.56的下载地址:

  http://dev.mysql.com/downloads/mysql/5.1.html#downloads

  操作系统环境:

  CentOS release 5.4 (Final) x86_64 GNU/Linux 2.6.18-164.el5


  2.安装配置

  (1)安装配置mysql-5.1.56

     在MySQL 5.1.38前的版本中,当你需要安装InnoDB Plugin时,必须下载Plugin的文件,解压后再进行一系列的安装。从MySQL 5.1.38开始往后,MySQL包含了2个不同版本的InnoDB存储引擎—一个是旧版本的引擎,称之为build-in innodb;另一个是1.0.4版本的InnoDB存储引擎。

Shell> tar –zxvvf mysql-5.1.56.tar.gz

Shell> cd mysql-5.1.56

Shell> ./configure --prefix=/opt/mysql5156 \

  --with-charset=utf8 --with-collation=utf8_general_ci \

  --with-extra-charsets=latin1,gb2312  \

  --with-plugins=innobase,innodb_plugin,myisam,heap,csv,federated,blackhole \

  --enable-local-infile --enable-thread-safe-client

Shell> make

Shell >make install

Shell> cp support-files/my-medium.cnf /etc/my.cnf

Shell>cd /opt/mysql5156

Shell>chown -R mysql .

Shell>chgrp -R mysql .

Shell>bin/mysql_install_db -user=mysql

Shell>chown -R root .

Shell> chown -R mysql var


  配置启动plugin-innodb

Shell > vi /etc/my.cnf

port            = 3307

socket          = /tmp/mysql5156.sock


[mysqld]

port            = 3307

socket          = /tmp/mysql5156.sock

ignore_builtin_innodb


  启动:shell>/opt/mysql5156/bin/mysqld_safe –user=mysql &

  加载plugin-innodb:

mysql>INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_TRX SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_LOCKS SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_LOCK_WAITS SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMP SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMP_RESET SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMPMEM SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMPMEM_RESET SONAME 'ha_innodb_plugin.so';

     上述语句只需执行一次就ok了,即使重启mysqld也不需要再次安装了。

     mysql > show plugins;

     mysql> select @@innodb_version;

  +------------------+

  | @@innodb_version |

  +------------------+

  | 1.0.15           |

  +------------------+

  1 row in set (0.00 sec)

  mysql执行INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';如果报错提示:ERROR 1289 (HY000): The ‘plugin’ feature is disabled; you need MySQL built with ‘HAVE_DLOPEN’ to have it working

  经上网搜索找到解决问题方法:

  在编译时不要用静态编译,将下面两个从编译参数中删除:

--with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static。至于原因不是很清楚。

 

(2)安装配置Xtrabackup

     先看看如何安装Xtrabackup,最简单的安装方式是使用RPM包,不过想使用源代码方式安装的话,其安装方式有点古怪,因为它采用的在MySQL源代码上打补丁构建的方式安装的。这里使用二进制包的安装方式,相对比较灵活。

Shell> mkdir /usr/local/xtrabackup

Shell> tar -zxvf xtrabackup-1.6.tar.gz -C /usr/local/xtrabackup

Shell>cd /usr/local/xtrabackup/bin

Shell>ln -s innobackupex-1.5.1 innobackupex

配置环境变量:

Shell>export PATH=$PATH:/usr/local/xtrabackup/bin

 

修改mysql配置文件:

Shell> vi /etc/my.cnf

添加或修改:datadir = /usr/local/mysql/var(数据库目录)

特别注意:default_table_type = InnoDB (必须改,否则进行增量备份的时候不成功)


三.xtrabackup的备份与恢复使用

关于xtrabackup的参数选项,如下:

--defaults-file=

  #默认配置文件的路径,如果补该参数,xtrabackup将从依次从以下位置查找配置文件:

  /etc/my.cnf 

  /etc/mysql/my.cnf

  /usr/local/etc/my.cnf

  ~/.my.cnf

  并读取配置文件中的[mysqld]和[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数据库的数据文件目录。

  xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)

  1.普通备份(全量备份)

shell>mkdir -p /backup/xtrabackup

shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup

  全量备份模拟恢复:

  需要执行两次xtrabackup --prepare

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup

  删除数据库目录下的数据文件:

Shell>rm -rf /usr/local/mysql/var/ib*

Shell>cp /backup/xtrabackup/ib* /usr/local/mysql/var

Shell>chown -R mysql.root /usr/local/mysql/var

  重启测试是否恢复成功。

注意,xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm)。

  2. 普通备份(增量备份)

  增量备份优点:

  1、数据库太大没有足够的空间全量备份,作增量备份有效节省空间,且效率高。

  2、支持热备份。备份过程不锁表,不受时间限制,不影响用户使用。

  3、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。

  4、备份恢复基于文件操作,降低直接对数据库操作风险。

  5、备份效率更高,恢复效率更高。

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

shell>mkdir -p /backup/xtrabackup/base

shell>mkdir -p /backup/xtrabackup/delta

  (1)先做一次全量备份,因为后面的增量备份要以此为基础

shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base

shell>ls /backup/xtrabackup/base

ibdata1  xtrabackup_checkpoints  xtrabackup_logfile

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

Shell>xtrabackup --defaults=/etc/my.cnf  --backup --target-dir=/backup/xtrabackup/delta/ --incremental-basedir=/backup/xtrabackup/base/

shell>ls /backup/xtrabackup/delta

ibdata1.delta  xtrabackup_checkpoints  xtrabackup_logfile

  ps:在增量备份的目录下,数据文件都是以.delta结尾的。增量备份只备份上一次全量备份后被修改过的page,所以增量备份只暂用较少的空间。增量备份可以在增量备份的基础上增量。

(注意:/backup/xtrabackup/delta/是每次都需修改的。比如第二次增量就改成/backup/xtrabackup/delta2,当然可以写个脚本进行自动备份)

  增量备份模拟恢复过程:

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

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/

--incremental-dir=/backup/xtrabackup/delta/

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/

shell>rm -rf /usr/local/mysql/var/ib* #删除原来数据目录下的数据文件

Shell>cp /backup/xtrabackup/base/ib* /usr/local/mysql/var

Shell>chown -R mysql.root /usr/local/mysql/var

  重启后测试是否成功。

  再次提醒,xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)。

  3.增量备份

  对比innobackupex和xtrabackup我们可以看到,innobackupex操作起来更方便,但是innobackupex会有短暂的锁表(时间依赖于MyISAM大小)。xtrabackup备份还有另一个重要特性:增量备份。(未来的版本innobackupex也可能增长该功能)

  比如表中目前有10条数据,先备份.备份到/usr/local/backup/1/目录 (完整备份)

shell> xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/1/

  查看它的lsn点:

shell> cat xtrabackup_checkpoints 

backup_type = full-backuped

from_lsn = 0:0

to_lsn = 0:592411

  再向表中插入数据,增量备份

shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/2/ --incremental-basedir=/usr/local/backup/1/

  把增量备份到2(1到2的增量备份)

  查看它的lsn点:

shell>cat xtrabackup_checkpoints 

backup_type = incremental

from_lsn = 0:592411

to_lsn = 0:908563

  再向表中插入数据,增量备份

shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/1/

  把增量备份到3(1到3的增量备份,2的备份已经包含在里面了,按照这种方式备份的话,最后的还原只需要还原完全备份和最后一份增量备份即可)

  查看它的lsn点:

shell>cat xtrabackup_checkpoints 

backup_type = incremental

from_lsn = 0:592411

to_lsn = 0:1507854


  或则另一种增量备份方式:

shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/2/

  把增量备份到3(2到3的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原完全备份和各个增量备份)

  查看它的lsn点:

shell>cat xtrabackup_checkpoints 

backup_type = incremental

from_lsn = 0:908563

to_lsn = 0:1507854

  增量备份模拟恢复:

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

  ①:基于(1到3的增量备份,2的备份已经包含在里面了,按照这种方式备份的话,最后的还原只需要还原完全备份和最后一份增量备份即可)

  把第1次的完备恢复

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/

  继续把增量备份恢复上去

shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/

shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ 

  恢复完成 

  接着

cd /usr/local/backup/1/

cp 1/ib* /usr/local/mysql/var/

chown –R mysql.root /usr/local/mysql/var

/etc/init.d/mysql restart


  ②基于(2到3的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原完全备份和各个增量备份)

  把第1次的完备恢复

xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/

  继续把增量备份恢复上去

shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/2/

  继续把增量备份恢复上去

shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/

  恢复完成 

  接着

cd /usr/local/backup/1/

cp 1/ib* /usr/local/mysql/var/

chown –R mysql.root /usr/local/mysql/var

/etc/init.d/mysql restart

四、innobackupex备份与恢复

Usage:

innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME]

             [--password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timestamp]

             [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]

             [--defaults-file=MY.CNF]

             [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR

innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF]

             [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR

innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR

  第一个命令行是热备份mysql数据库。

  带有--apply-log选项的命令是准备在一个备份上启动mysql服务。

  带有--copy-back选项的命令从备份目录拷贝数据,索引,日志到my.cnf文件里规定的初始位置。

参数注释:

--defaults-file=

  #同xtrabackup的--defaults-file 参数;

--apply-log

  #对xtrabackup的--prepare参数的封装;

--copy-back

  #做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir;

--remote-host=HOSTNAME

  #通过ssh将备份数据存储到进程服务器上;

--stream=[tar]

  #备份文件输出格式,tar时使用tar4ibd,该文件可在XtarBackup binary文件中获得。如果备份时有指定--stream=tar,则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩,在XtraBackup的binary包中可获得该文件);

--tmpdir=DIRECTORY

  #当有指定--remote-host or --stream时,事务日志临时存储的目录,默认采用MySQL配置文件中所指定的临时目录tmpdir;

--redo-only --apply-log组,

  #强制备份日志时只redo,跳过rollback。这在做增量备份时非常必要;

--use-memory=

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

--throttle=IO

  #同xtrabackup的--throttle参数;

--sleep=

  #是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册;

--compress[=LEVEL]

  #对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;

--include=REGEXP

  #对xtrabackup参数--tables的封装,也支持ibbackup;

--databases=LIST

  #列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份 ;

--uncompress

  #解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;

--slave-info

  #备份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info文件,这里会保存主日志文件以及偏移, 文件内容类似于:

CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET

  #MySQL服务器的socket文件位置

1、使用Innobachkupex备份(暂不支持增量备份)

  (1)普通备份 

shell> mkdir -p /backup/innobackupex/ 

Shell>innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root \

--databases='i_db' --no-lock /backup/ innobackupex /  \

2> /tmp/innobackup.log          


xtrabackup_51  Ver 1.5 Rev undefined for 5.1.52 unknown-linux-gnu (x86_64)

[01] Copying /usr/local/mysql/var/ibdata1

     to /backup/innobackupex/2011-04-12_00-44-29/ibdata1

[01]        ...done

xtrabackup: The latest check point (for incremental): '0:32538662'

xtrabackup: Stopping log copying thread.

xtrabackup: Transaction log of lsn (0 32538662) to (0 32538662) was copied.


注释:

  使用mysql的root用户备份,密码为root 

  备份文件的存放路径是/backup/innobackupex/,该目录下将创建以时间戳为名称的备份目录

  --no-lock备份时不锁定表

  --databases="i_db"用于指定要备份的数据库 

  2>/tmp/backup.log是将备份过程中的输出信息保存到/tmp/backup.log

注意:在使用innobackupex进行备份时,在配置文件my.cnf中要明确指定mysql的数据文件目录,否则会报错。

[mysqld]

datadir=/usr/local/mysql/var

 

  (2)打包(tar)备份 

Shell>innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root \

--databases='i_db' --no-lock  --stream=tar  /backup/innobackupex/  \

2> /tmp/innobackup.log  1> /backup/innobackupex/i_aura.tar

  这种备份时间会比较长,主要是执行打包操作。解包过程,需要使用tar ixvf解压对应的文件后,注意参数-i必须加入。

 

模拟恢复过程:

Shell> mysql –uroot –proot –e’drop database i_db’

Shell>mysqladmin –uroot –proot shutdown

Shell>rm –rf /usr/local/mysql/var/ib *

shell >cd /backup/innobackupex/

shell >tar ixvf i_aura.tar

shell>ls

backup-my.cnf  i_aura.tar  ibdata1  i_db  stderr  stdout  xtrabackup_binary  xtrabackup_checkpoints xtrabackup_logfile

准备还原

shell>innobackupex-1.5.1 --defaults-file=/etc/my.cnf --no-lock --apply-log  /data/back_data/

拷贝还原数据:

shell>innobackupex --defaults-file=/etc/my.cnf  –no-lock  --copy-back /backup/innobackupex/

Shell>cd /usr/local/mysql/var

Shell>chown -R mysql:root .   #一定要修改权限

shell> mysqld_safe –user=mysql &

检查删除的数据库,如果恢复则证明该恢复过程无误。

 

(3)压缩(tar)备份 

Shell>innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root \

--databases=”i_db test”--no-lock  --stream=tar  /backup/innobackupex/  \

2> /tmp/innobackup.log  | gzip > /backup/innobackupex/i_aura.tar

这种备份时间会比较长,主要是执行压缩操作。 

解压缩过程,需要使用tar izxvf 解压对应的文件后,注意参数-i必须加入。

 

还原:

使用tar -izxvf解压对应的文件后,操作完全同普通备份。

模拟恢复过程:

Shell> mysql –uroot –proot –e’drop database i_db’

Shell>mysqladmin –uroot –proot shutdown

Shell>rm –rf /usr/local/mysql/var/ibdata1 ib_logfile*

shell >cd /backup/innobackupex/

shell >tar ixvf i_aura.tar

shell>ls

backup-my.cnf  i_aura.tar.gz  ibdata1  i_db  stderr  stdout  xtrabackup_binary xtrabackup_checkpoints  xtrabackup_logfile

准备还原:

shell> innobackupex --defaults-file=/etc/my.cnf  –no-lock  --apply-log /backup/innobackupex/……

拷贝还原数据:

shell> innobackupex --defaults-file=/etc/my.cnf  –no-lock  --copy-back /backup/innobackupex/

Shell>cd /usr/local/mysql/var

Shell>chown -R mysql:root .

shell> mysqld_safe -user=mysql &

检查删除的数据库,如果恢复则证明该恢复过程无误。

 

(4)整库备份及恢复。

备份:

Shell>innobackupex --user=root --password=root --defaults-file=/etc/my.cnf \

     /backup/innobackupex/

检查备份的文件:

Shell>ls /backup/innobackupex/

2011-04-12_09-20-13

 

模拟恢复:

首先停掉数据库,然后删除数据库目录下的所有数据库文件。

Shell> mysql –uroot –proot shutdown

Shell>rm -rf /usr/local/mysql/var/*

首先写日志文件,然后恢复,如下。(注:2011-04-12_09-20-13是自动生成的以备份时间命名的文件夹,恢复时根据情况进行选择)

Shell>innobackupex --apply-log --defaults-file=/etc/my.cnf \

 /backup/innobackupex/2011-04-12_09-20-13

Shell>innobackupex --copy-back --defaults-file=/etc/my.cnf \

/backup/innobackupex/2011-04-12_09-20-13

使用cd或者ls 命令看看你的数据库目录下是不是有文件了?

修改数据库文件权限,否则无法启动。(这步我是cd到原数据库目录下进行的)

Shell>chown -R mysql:mysql .

重启数据库,测试恢复是否成功。

五.备份到远程服务器

(1)innobackupex远程备份方法一

当前数据库所在机器IP:192.168.1.131,现在要备份到192.168.1.132的/data目录下。

Shell>innobackupex --user=root --password=root --defaults=/etc/my.cnf --stream=tar /data | ssh root@192.168.1.132  cat " >" /data/backup.tar

接着需要输入远程服务器密码......然后就开始备份了,备份完成后登陆到远程服务器看看是不是有了呢?

目前使用xtrabackup增量备份是不支持到远程的。如何解决呢?可以使用nfs 网络文件系统把远程服务器磁盘挂载到本地。

 

(2)innobackupex远程备份方法二

#在本地后台启动1234监听,以便接受备份文件

nc -d -l 1234 > /data/$A/20100118000001.tar &

#ssh到服务器A执行备份,并将备份包推送到备份机B上。同时记录下log。

ssh $A ‘innobackupex-1.5.1 --stream=tar --include=’renren.*’ --throttle=500 --socket=/data/mysql/backup/mysql.sock --defaults-file=/data/dbbackup/my.cnf --user=root --password=xxxxxxx --slave-info /data/dbbackup | nc  $B 1234′ < /dev/null > /data/xtrabackup.log 2>&1

    参数解释:

--stream=tar : 告诉xtrabackup,备份需要以tar的文件流方式输出。

--include=’renren.*’:备份包含的库表,如例:意思是要备份renren库中所有的表。如果需要全备份,则省略这个参数;如果需 要备份renren库下的2个表:tableA & tableB,则写成:--include=’renren.tableA|renren.tableB’;再如果renren库下只有2个前缀是 table的表,你还可以写成:--include=’renren.table*’。

--throttle=500:xtrabackup在备份过程中,IO操作比较多,因此需要限定一下IO操作。以免服务器压力过大,不过好像作用不太明显,也不知道是不是设置的还是过大。待测…

--socket=/data/mysql/backup/mysql.sock:指定mysql.sock所在位置,以便备份进程登录mysql.

--defaults-file=/data/dbbackup/my.cnf :如果您的/etc/my.cnf中没有使用如[mysqld3306]的片段启动mysql,则不需要这行参数,如果使用了上面的片段,那么 xtrabackup是无法解析/etc/my.cnf文件的(严格上来说是会解析错误),所以,我们需要手工完成一个my.cnf文件,文件片段如下, 只需要指定6个参数即可让xtrabackup正常工作,各参数意思请参考mysql文档:

[mysqld]

datadir=/data/var

innodb_data_home_dir = /data/ibdata

innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend

innodb_log_group_home_dir = /data/iblogs

innodb_log_files_in_group = 2

innodb_log_file_size = 1G


本文转载自:http://blog.sina.com.cn/s/blog_616b428f0101836h.html