经过几天的测试,文档终于可以与大家分享了。使用Xtrabackup能够非常快速地备份与恢复mysql数据库,是mysql dba的首选。Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。 Xtrabackup有两个主要的工具:xtrabackup、innobackupex xtrabackup只能备份InnoDB和XtraDB两种数据表,支持在线热备份,不会锁表 innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表
===================================================
一、 centos 5.5 下安装配置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
希望永久生效的话,可以加到
echo "export PATH=$PATH:/usr/local/xtrabackup/bin" >> /etc/profile
source /etc/profile

修改mysql配置文件:
Shell> vi /etc/my.cnf
添加或修改:datadir =/usr/local/mysql/var(数据库目录)
特别注意:default_table_type = InnoDB(必须改,否则进行增量备份的时候不成功) ================================================= 二、建立测试数据 1.调整my.cnf参数 Shell> vi /etc/my.cnf
添加或修改:datadir =/usr/local/mysql/var(数据库目录)
特别注意:default_table_type = InnoDB(必须改,否则进行增量备份的时候不成功) 2.建立数据库 mysql -uroot -p123456 create database test_myisam CHARACTER SET=gbk; create database test_innodb CHARACTER SET=gbk; 3.建立数据表 use test_myisam; CREATE TABLE `t_myisam` ( `id` bigint(20) NOT NULL auto_increment, `name` varchar(50) default NULL, `password` varchar(150) default NULL, `userstatus` int(2) default NULL, PRIMARY KEY (`id`) ); show create table t_myisam\G; use test_innodb; CREATE TABLE `t_innodb` ( `id` bigint(20) NOT NULL auto_increment, `name` varchar(50) default NULL, `password` varchar(150) default NULL, `userstatus` int(2) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB CHARACTER SET=gbk; show create table t_innodb\G; 4.建立存储过程 vi addTest.sql DROP procedure IF EXISTS addTest; delimiter // create procedure addTest(i int) begin declare name varchar(64); delete from test_myisam.t_myisam where id != '0'; delete from test_innodb.t_innodb where id != '0'; While i>0 do Set name=concat('test',i); insert into test_myisam.t_myisam(id,name,password,userstatus) values (i,name,password(name),1); insert into test_innodb.t_innodb(id,name,password,userstatus) values (i,name,password(name),1); Set i=i-1; END while; end // delimiter ; 说明: addTest(i int),i为插入数据的行数,先删除以前的数据,然后再写入到2个库的2个表中,数据内容一样。 5.写入数据 mysql -uroot -p123456 test_myisam /data/backup/db/backup1.log xtrabackup_50 Ver 1.3 Rev 148 for 5.0.91 unknown-linux-gnu (x86_64) Copying ./ibdata1 to /www/backup/db/innobackup/2010-08-23_14-38-05/ibdata1 ...done xtrabackup: The latest check point (for incremental): '0:1720034804' xtrabackup: Stopping log copying thread. xtrabackup: Transaction log of lsn (0 1720034804) to (0 1720034804) was copied. 说明: 使用mysql的root用户备份,密码为123456 备份的目标目录是/usr/local/mysql/var,--databases="test_myisam test_innodb"用于指定要备份的数据库 这里的2>/u01/backup/1/1.log,是将备份过程中的输出信息重定向到/www/backup/db/backup1.log
三、测试 1.innobackupex备份
innobackupex-1.5.1 选项注释如下:
innobackupex-1.5.1[--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] 
           [--password=WORD] [--port=PORT][--socket=SOCKET] [--no-timestamp] 
           [--ibbackup=IBBACKUP-BINARY][--slave-info] [--stream=tar]
           [--scpopt=OPTIONS-FOR-SCP]
           [--defaults-file=MY.CNF]
           [--databases=LIST][--remote-host=HOSTNAME] [--no-lock] BACKUP-ROOT-DIR
对数据库进行热备。默认情况下以当前时间戳创建备份根目录。上述命令完整备份所有 MyISAM InnoDB 引擎表以及索引。包含 .frm,.MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .opt, .par InnoDB 数据和日志文件。使用 mysql 客户端程序连接 mysql 服务器,运行 ibbackup(InnoDB 热备程序 ) 作为一个子进程。
 
innobackupex-1.5.1--apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF]
           [--export] [--redo-only][--ibbackup=IBBACKUP-BINARY] BACKUP-DIR
从备份恢复,运行 ibbackup 子进程,但是不能连接到数据库。按照 BACKUP-DIR/backup-my.cnf 定义,使用 BACKUP-DIR/ibbackup_logfile 恢复 InnoDB 数据文件和创建新的 InnoDB 日志文件。
 
innobackupex-1.5.1--copy-back [--defaults-file=MY.CNF] BACKUP-DIR
从备份目录拷贝数据,索引和日志文件到原 datadir 目录。
 
--defaults-file=[MY.CNF] 该选项传递给 xtrabackup 子进程,从指定文件读取缺省选项
--apply-log  从备份恢复。
--redo-only  该选项强制跳过 rollback 阶段,只进行 redo 。这是有必要使用的,如果备份后,要使用增量改变的。
--copy-back  从备份目录拷贝数据和索引文件到 datadir 目录
--remote-host=HOSTNAME 备份到远程主机上,使用 ssh
--stream=[tar|cpio(notimplemented)]  指定备份标准输出格式
--tmpdir=DIRECTORY 默认与 tmpdir 相同。使用 —remote-host —stream 参数后,传输日志文件将存放在临时目录下
--use-memory=MB 选项传递给 xtrabackup 子进程。恢复使用内存大小
--parallel=NUMBER-OF-THREADS 选项传递给 xtrabackup 子进程,指定数据传输线程总数。默认为 1
--throttle=IOS 选项传递给 xtrabackup 子进程,限制 IO 线程数量
--sleep=MS  选项传递给 xtrabackup 子进程。每拷贝 1MB 数据暂停多少 MS 时间
--compress[=LEVEL] 选项传递给 xtrabackup 子进程。压缩级别在 0-9.1 快速压缩, 9 最佳压缩, 0 不压缩。默认为 1.
--include=REGEXP 选项传递给 xtrabackup 子进程。使用正则进行匹配
--databases=LIST 指定备份数据库
--tables-file=FILE
--uncompress 选项传递给 xtrabackup 子进程。对压缩过的 InnoDB 数据文件不进行压缩
--export  仅使用于 prepare 选项。选项传递给 xtrabackup 子进程。
--user=NAME
--password=WORD
--host=HOST
--port=PORT
--slave-info  备份复制从服务端,主从信息记录在 ibbackup_slave_info 文件中
--socket=SOCKET
--no-timestamp 不在备份根目录下创建以当前时间戳为名称的新的备份目录
--ibbackup=IBBACKUP-BINARYibbackup 二进制路径
--no-lock  禁止表级锁。全部是 InnoDB 引擎表和不关系二进制日志位置下使用
--scpopt=SCP-OPTIONS 指定 scp 参数

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases="test_myisam test_innodb" /root/backups>>/root/backups/backup.log 2>&1

压缩(tar gzip)备份 innobackupex-1.5.1 --defaults-file=/etc/mysql/my.cnf --no-lock --user=root --password=gaojinbo --databases="test_myisam test_innodb" --stream=tar /www/backup/db/innobackup/ 2>/www/backup/db/backup2.log | gzip > /www/backup/db/innobackup/2.tar.gz 这种备份时间会比较长,主要是执行压缩。 恢复过程,只需要使用tar izxvf 解压对应的文件后,操作完全同普通备份。 2.模拟恢复过程
/etc/init.d/mysql stop cd /usr/local/mysql/var
rm -rf test_myisam; rm -rf test_innodb; rm -f ibdata1 rm -f ib_logfile* innobackupex --apply-log --defaults-file=/etc/my.cnf --user=root --password=123456 /data/backup/2012-04-24_01-03-36 cp -r /data/backup/2012-04-24_01-03-36/ib* ./
cp -r /data/backup/2012-04-24_01-03-36/test_myisam ./
cp -r /data/backup/2012-04-24_01-03-36/test_innodb ./ chown -R mysql:mysql test_myisam/
chown -R mysql:mysql test_innodb/ chown mysql:mysql ib* /etc/init.d/mysql start 通过以上步骤就能完全恢复mysql数据了,恢复过程中必须要启动mysql 3.检验数据后的数据 select * from test_myisam.t_myisam where id<300; select * from test_innodb.t_innodb where id<300; show create table test_myisam.t_myisam; show create table test_innodb.t_innodb; mysql> select count(*) from test_myisam.t_myisam; +----------+ | count(*) | +----------+ | 10000000 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from test_innodb.t_innodb; +----------+ | count(*) | +----------+ | 10000000 | +----------+ 1 row in set (17.78 sec) 为何查询时间相差这么大? myisam 的表rows 记录在表信息中,innodb 的要扫描表 ============================================== 四、xtrabackup备份与恢复 xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)
xtrabackup 选项注释如下:
--print-defaults 显示默认选项。 Xtrabackup 默认情况会去读 my.cnf 文件,读取顺序是 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
--no-defaults  忽略任何 my.cnf 文件选项
--defaults-file=# 读取指定的 my.cnf 文件
--defaults-extra-file=# 再读取另外一个文件
--target-dir=name 目的目录,默认目录在 ./xtrabackup_backupfiles/ ,相对于 datadir 目录
--backup  备份
--stats  计算 datadir 目录统计信息
--prepare  backup 恢复
--export  在恢复时,创建文件导入到另一个数据库
--apply-log-only 在恢复时,停止恢复进程不进行 LSN 只使用 log
--print-param  打印出参数
--use-memory=#buffer_pool_size
--suspend-at-end 在备份时,创建 xtrabackup_suspended 文件,直到备份完成后删掉
--throttle=#  限制 IO 总数
--log-stream  记录标准输出信息 xtrabackup_logfile
--extra-lsndir=name 仅适用于 backup ,保存另一份 xtrabackup_checkpoints 文件
--incremental-lsn=name 仅适用于 backup ,增量备份
--incremental-basedir=name 仅适用于 backup ,增量备份目录
--incremental-dir=name 仅适用于 prepare ,恢复指定目录下的 .delta 文件和日志文件
--tables=name  过滤某些表
--tables_file=name 过滤 database.table 列表文件
--create-ib-logfile
-h,--datadir=name datadir 目录
-t,--tmpdir=name tmpdir 目录
--parallel=#  默认为 1. 传输数据文件的并行线程数。没有任何流模式的影响
--innodb_*  有关 innodb 参数
1.普通备份
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d`
cp -r /usr/local/mysql/var/test_innodb /data/backup/db/xtrabackup/`date +%Y-%m-%d` 
模拟恢复过程
cd /usr/local/mysql/var
/etc/init.d/mysql  stop
rm -rf test_innodb
rm -f ibdata1 rm -f ib_logfile* xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d`
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d`
cp /data/backup/db/xtrabackup/`date +%Y-%m-%d`/ib* /usr/local/mysql/var cp -r /data/backup/db/xtrabackup/`date +%Y-%m-%d`/test_innodb /usr/local/mysql/var chown -R mysql:mysql /usr/local/mysql/var /etc/init.d/mysql start 2.增量备份 修改存储过程,新增500万条数据(略) mysql> select count(*) from t_innodb; +----------+ | count(*) | +----------+ | 15000000 | +----------+ 1 row in set (5.23 sec) mkdir -p /data/backup/db/xtrabackup/`date +%Y-%m-%d`-incre xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d`-incre --incremental-basedir=/data/backup/db/xtrabackup/`date +%Y-%m-%d` 3.模拟恢复过程 cd /usr/local/mysql/var /etc/init.d/mysql stop
rm -rf test_innodb
rm -f ibdata1 rm -f ib_logfile* xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d` xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d` --incremental-dir=/data/backup/db/xtrabackup/`date +%Y-%m-%d`-incre cp /data/backup/db/xtrabackup/`date +%Y-%m-%d`/ib* /usr/local/mysql/var cp -r /data/backup/db/xtrabackup/`date +%Y-%m-%d`/test_innodb /usr/local/mysql/var chown -R mysql:mysql /usr/local/mysql/var chown -R mysql:root /usr/local/mysql/var/mysql /etc/init.d/mysql start 4.检验恢复后的数据 mysql -uroot -p123456 use test_innodb; mysql> select count(*) from t_innodb; +----------+ | count(*) | +----------+ | 15000000 | +----------+ 1 row in set (19.03 sec) 可以看出,数据完全被恢复了。

参考文章:
http://www.gaojinbo.com/mysql-dba%E9%A6%96%E9%80%89%E5%A4%87%E4%BB%BD%E5%B7%A5%E5%85%B7xtrabackup%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEv1-1.html