Xtrabackup 简介:

    Xtrabackup 是percona公司(mysqlperformanceblog)的开源项目,目的是实现类似innodb官方的热备份工具InnoDB Hot Backup的功能,可以帮助我们对MySQL InnoDB类型的数据库表进行在线热备份。 


Xtrabackup中包含两个工具: 
* xtrabackup - 用于热备份innodb, xtradb表的工具,不能备份其他表。 
* innobackupex - 对xtrabackup封装的perl脚本,提供了myisam表备份的能力。(能进行整库和数据表备份)。本文旨在介绍Xtrabackup工具对数据库进行增量备份实践。

优点:

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

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


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

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

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



实践探索:

测试之前先备份好数据库!


1、下载:

http://www.percona.com/percona-builds/XtraBackup/XtraBackup-1.0/

选择一个合适的版本。以rpm包为例,xtrabackup-1.0-56.rhel5.x86_64.rpm。
2、安装(必须先安装mysql-client):

# rpm -ivh xtrabackup-1.0-56.rhel5.x86_64.rpm

3、修改数据库配置文件:

# vim /etc/my.cnf   datadir = /var/lib/mysql/(添加或修改:数据库目录)

特别注意:default_table_type = InnoDB (必须改,否则进行增量备份的时候不成功,我测试的时候因为这个折腾了很久)

另外建一个用于数据备份的目录

# mkdir  /var/backups

4、重启数据库:

# mysqladmin -u root -p shutdown # service mysqld start

备份策略:

整库备份直接用innobackupex-1.5.1脚本。

只对InnoDB或xtradb表,进行备份直接用xtrabackup。


       由于xtrabackup不能备份表结构,所以备份时首先用innobackupex-1.5.1脚本对数据库进行整库备份。再用xtrabackup进行表备份。分别进行。恢复时也分别进行恢复。如果发生表结构丢失则先使用innobackupex-1.5.1进行恢复,然后再用xtrabackup恢复增量数据。用生成的文件ib*覆盖用innobackupex-1.5.1恢复后的ib*文件。



一、整库备份及恢复。

   备份

# innobackupex-1.5.1 --defaults-file=/etc/my.cnf --user=root --password=cdqd    /var/backups/

(root为数据库用户名,cdqd为数据库密码,/etc/my.cnf为mysql配置文件所在位置,/var/backups/为备份文件存储目录,执行后会在)

   恢复

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

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

# innobackupex-1.5.1 --apply-log --defaults-file=/etc/my.cnf  /var/backups/2010-04-17_22-19-30 # innobackupex-1.5.1 --copy-back --defaults-file=/etc/my.cnf  /var/backups/2010-04-17_22-19-30

报错:innobackupex: Error: extra argument found /

方法:删除innobackupex: Error: extra argument found /

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


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

#chown -R mysql:mysql *

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


二、全量备份及恢复(使用xtrabackup,仅限InnoDB和xtradb表,且注意mysql配置文件my.cnf中“default_table_type = InnoDB”否则不成功)。

#xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/var/backups/base/

  执行两次:

#xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/var/backups/base #xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/var/backups/base

  将数据库停掉,删除数据库下的ib*(ib开头的所有)文件。将/var/backups/base目录下的ib*文件拷贝到数据库目录。

  设置权限:

#chown mysql:mysql ib*

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


三、增量备份及恢复(再次强调,xtrabackup做增量仅限InnoDB和xtradb表,且注意mysql配置文件my.cnf中“default_table_type= InnoDB”否则不成功)。


做增量前当然要先进行全量备份,在全量的基础上来进行增量。


首先进行全量备份。

# xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/var/backups/base/

在全量备份的基础上进行增量。

# xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/var/backups/1/ -- incremental-basedir=/var/backups/base

......

(注:/var/backups/1/是每次都需修改的。比如第二次增量就改成/var/backups/2,当然可以写个脚本进行自动备份,备份脚本将陆续奉上......恢复的时候也是一样)


增量恢复。(步骤同全量恢复,只是在执行恢复命令的时候中间多一步)

# xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/var/backups/base # xtrabackup --target-dir=/backups/base --prepare --incremental-dir=/var/backups/1 # xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/var/backups/base

  将数据库停掉,删除数据库下的ib*文件。将/var/backups/base目录下的ib*文件拷贝到数据库目录。

  设置权限:

#chown mysql:mysql ib*

重启后测试。是否成功。


注:备份前先登录数据库,打开一个表看看记录条数,然后进行备份,然后再对表最终的记录进行修改,然后在备份,再测试。

   

附图:

全量备份结果


 

 

增量结果

比较一下增量是不是有效的节省了空间呢?当然我这里测试用的只有 10多M 对于大型数据库则区别就更大了。

 

转载自 http://xikder.blog.51cto.com/1423200/309339