Xtrabackup增量备份探索
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、下载:
选择一个合适的版本。以rpm包为例,xtrabackup-1.0-56.rhel5.x86_64.rpm。
2、安装(必须先安装mysql-client):
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 --user=root --password=cdqd --defaults-file=/etc/my.cnf /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
使用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 对于大型数据库则区别就更大了。