经过几天的测试,文档终于可以与大家分享了。使用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 �CC /usr/local/xtrabackup
Shell>cd /usr/local/xtrabackup/bin
Shell>ln �Cs 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