利用Xtrabackup工具备份及恢复(MySQL DBA的必备工具)
xtrabackup------mysql dba的必备工具
注意:
1)文档参照http://www.percona.com/docs/wiki/percona-xtrabackup:start
2)mysql要使用5.1.50版本或以上。
一、xtrabackup简介及安装
1、xtrabackup 是percona的一个开源项目,可以热备份innodb ,xtradb,和myisam(会锁表),可以看做是innodb hotbackup的免费替代品。
percona support for mysql
benefit | silver (per server) |
gold (unlimited) |
platinum (unlimited) |
---|---|---|---|
annual price | $1,500/server | from $15,000 | from $30,000 |
number of servers covered | per-server | unlimited | unlimited |
number of support incidents | unlimited | unlimited | unlimited |
response time sla | 60 minutes | 30 minutes | 30 minutes |
named support contact persons | 5 | 10 | 20 |
email, web, & chat support | |||
phone support | |||
login support | |||
24×7 support | |||
fixes for verified bugs | |||
hot bug fixes | |||
onsite system audit | option | ||
covers old server versions | |||
covers non-standard platforms | option | ||
covers custom code | option |
参考:http://www.percona.com/mysql-support/
先看看如何安装xtrabackup,最简单的安装方式是使用rpm包,不过想使用源代码方式安装的话,其安装方式有点古怪,因为它采用的在mysql源代码上打补丁构建的方式安装的。
2、安装:
wget http://www.percona.com/downloads/xtrabackup/xtrabackup-1.4/linux/binary/i686/
tar zxf xtrabackup-1.4.tar.gz
cd xtrabackup-1.4
./configure
make
进行到这里时,千万别make install,那样就会接着安装mysql了,正确方法是:
cd innobase/xtrabackup/
make
make install
安装参照:http://www.percona.com/docs/wiki/percona-xtrabackup:installation:from-source
3、如此一来,就会在/usr/bin目录里安装上两个有用的工具:xtrabackup、innobackupex
1)xtrabackup 只能备份innodb和xtradb两种数据表,支持在线热备份,可以在不加锁的情况下备份innodb数据表,不过此工具不能操作myisam引擎表
2)innobackupex 是一个脚本封装,封装了xtrabackup,能同时处理innodb和myisam,但在处理myisam时需要加一个读锁。
按如上的介绍,由于操作myisam时需要加读锁,这会堵塞线上服务的写操作,而innodb没有这样的限制,所以数据库中innodb表类型所占的比例越大,则越有利。实际应用中一般是直接使用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文件里规定的初始位置。
xtrabackup还可以用来moving innodb tables between servers,更多的内容可以参考官方文档及例子。
参考链接:
1.官方文档:http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual
2.xtrabackup online backup for innodb/xtradb(pdf):
http://www.percona.com/ppc2009/ppc2009_xtrabackup.pdf
注:innobackupex会根据/et/my.cnf来确定mysql的数据位置。
1.普通备份:
innobackupex [--defaults-file=/etc/my.cnf] --user=root [--host=192.168.1.52] [--password=xxx] [--port=3306] /data/back_data/ 2>/data/back_data/1.log
备份的目录是/data/back_data/,这里的2>/data/back_data/1.log,是将备份过程中的输出信息重定向到1.log
innobackupex-1.5.1 –slave-info …..
–slave-info会记录复制主日志的 复制点,便于重新做复制用。(用在备份从机器用)
备份后的文件:
xtrabackup_binlog_info — 存放binlog的信息。(binlog需要另外拷贝备份,如果需要binlog的话)
xtrabackup_checkpoints — 存放备份的起始位置和结束位置。
恢复:
首先停掉数据库,然后删除数据库目录下的所有数据库文件.
cd /data/mysql_data
rm -rf * # 删除数据目录里的所有文件
innobackupex-1.5.1 --user=root --apply-log /data/back_data/2010-10-26_16-09-37 # 应用日志
innobackupex-1.5.1 --user=root --copy-back /data/back_data/2010-10-26_16-09-37
默认innobackupex-1.5.1会将二进制日志信息存放在文件xtrabackup_binlog_info中发(方便做slave)。
cd /data
chown -r mysql:mysql mysql_data/
重启mysql服务
2.打包(tar)备份:
innobackupex-1.5.1 --user=root [--password=xxx] --stream=tar /data/back_data/2/ 2>/data/back_data/2.log 1>/data/back_data/2.tar
还原:
#cd /data/back_data/2/
#tar ixvf 2.tar
# ls
2.tar backup-my.cnf ibdata1 ibdata2 mablevi mysql xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile
准备还原
# innobackupex-1.5.1 --user=xxx [--password=xxx]--apply-log /data/back_data/
……
innobackupex: completed ok!
删除数据目录里的所有文件
rm -rf /data/mysql_data/*
拷贝:
# innobackupex-1.5.1 --user=xxx [--password=xxx] --copy-back /data/back_data/
……
innobackupex: completed ok!
cd /data
chown -r mysql:mysql mysql_data/
重启mysql服务
3. 压缩(tar gzip)备份
innobackupex-1.5.1 --user=root [--password=xxx] --stream=tar
/data/back_data/2/ 2>/data/back_data/2.log | gzip > /data/back_data/2.tar.gz
这里使用了管道|将innobackupex-1.5.1作为gzip的标准输入。恢复,只需要使用tar -izxvf 解压对应的文件后,操作完全同普通备份。
还原:
使用tar –izxvf 解压对应的文件后,操作完全同普通备份。
#cd /data/back_data/2/
#tar ixvf 2.tar
# ls
backup-my.cnf ibdata1 ibdata2 mablevi mysql xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile
准备还原:
# innobackupex-1.5.1 --user=xxx [--password=xxx] --apply-log /data/back_data/2/
……
innobackupex: completed ok!
删除数据目录里的所有文件
rm -rf /data/mysql_data/*
# innobackupex-1.5.1 --user=xxx [--password=xxx] --copy-back /data/back_data/2/
cd /data
chown -r mysql:mysql mysql_data/
重启mysql服务
———————————————————————————————————————
xtrabackup 备份和恢复
备份:
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/back_data/
恢复:
需要执行两次xtrabackup –prepare
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/back_data/
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/back_data/
注意,xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm)。
增量备份:
1. 全量备份
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/back_data/
2. 增量备份
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/back_data_inc/ --incremental-
basedir=/data/back_data/
在增量备份的目录下,数据文件都是以.delta结尾的。增量备份只备份上一次全量备份后被修改过的page,所以增量备份只暂用较少的空间。增量备份可以在增量备份的基础上增量。
增量备份恢复:
我们需要分别对全量、增量备份各做一次prepare操作。
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/back_data/2010-10-26_16-09-37
xtrabackup --prepare --target-dir=/data/back_data/2010-10-26_16-09-37--incremental-
dir=/data/back_data_inc
xtrabackup --prepare --target-dir=/data/back_data/ #这一步不是必须的
这样,/data/back_data/下的数据文件就可以直接放到你的mysql数据目录下,恢复数据了。
再次提醒,xtrabackup只备份innodb数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)。
rm -rf /data/mysql_data/ib*
cp -i /data/back_data/2010-10-26_16-09-37/ib* /data/mysql_data/
cd /data
chown -r mysql:mysql mysql_data/
2.innobackupex 与 xtrabackup 相结合
首先,innobackupex全备份:
innobackupex --user=root /data/back_data/ 2>/data/back_data/1.log #会生成一个时间文件夹,这里假如是2010-10-29_15-57-44
然后,xtrabackup 做增量备份:
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/back_data_inc/4 --incremental-basedir=/data/back_data/2010-10-29_15-57-44
恢复:
首先停掉数据库,备份二进制日志(如果有的话),然后删除数据库目录下的所有数据库文件.
cd /data/mysql_data
rm -rf * # 删除数据目录里的所有文件
恢复全量备份:
innobackupex --user=root --apply-log /data/back_data/2010-10-29_15-57-44 # 应用日志
innobackupex --user=root --copy-back /data/back_data/2010-10-29_15-57-44 # 拷贝文件
恢复增量备份:
xtrabackup --prepare --target-dir=/data/back_data/2010-10-29_15-57-44 --incremental-dir=/data/back_data_inc/5
cd /data
chown -r mysql:mysql mysql_data/
重启mysql服务。
上一篇: 改进网页可读性的7个方法
下一篇: ASP.NET常用小技巧