innobackupex实际上是percona-xtrabackup的perl整合脚本,功能当然更强大一些.

xtrabackup备份实际上是在线的物理热备,为什么这么说呢,因为实际上他是以拷贝mysql物理文件来备份的方式,只是加入了一些锁和钩子来避免数据缺失,优势当然就是快了,物理拷贝始终是速度最快的备份方式,缺点就是占用空间大.

备份原理很多文章有写,重点在于备份初期会创建一个redo的钩子,让在备份期间产生的数据都能记录下来,而备份数据文件时也会锁一下表,这样数据就会更完整.

安装方法在另一篇文章已经说了,就不多说了,下面直接介绍使用方法和一些参数说明.

xtrabackup支持全备和增备,但是我个人不建议用增备,因为增备效果不怎么样,而且直接拷贝binlog其实也挺好用,所以全备+binlog就可以了.


备份:

全备命令:

#既然是热备工具,当然是在mysql启动的时候执行的
/etc/init.d/mysql status
#然后执行命令,直到完毕
/usr/bin/innobackupex --defaults-file=$cnfdir --user=root --password=$pwdr --host=$hosts --parallel=4 --throttle=400 --stream=tar  $backupdir 2>$backupdir/backtip.log |gzip >$backupdir/$backname.tar.gz

完成备份后出现

innobackupex: completed OK!

就是完成了.


命令参数说明:

--defaults-file    备份数据库的配置文件my.cnf的路径

--user=root    备份操作用户名,一般都是root用户,但可以改 
--password=$pwdr    备份操作用户名的密码
--host=$hosts    主机ip,本地可以不加,ssh传输,要开放端口
--parallel=4    并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。

--throttle=400    运行io限制数,一般来说并行能增加速度,但是IO也高,限制能减少影响

--stream=tar    压缩类型,这里选择tar格式,好像也只能是tar
$backupdir    备份存放的目录
2>$backupdir/backtip.log    备份日志,将备份过程中的输出信息重定向到log
|gzip >$backupdir/$backname.tar.gz    备份文件后用管道再压缩,最后成为一个压缩文件,减少占用空间


还有一些常用参数:

--databases    指定备份的数据库和某个库的表,例如这样:--databases="db db.table",不过要注意的是,他依然会把mysql库备份一遍,因为有很多公共信息还是依赖到他.

--no-lock    可以在备份非innodb表和frm文件时不锁表,但是master和slave的pos信息就无法记录,因为write_binlog_info和write_slave_info函数只在mysql_lockall函数中调用,而mysql_lockal调用了flush tables with read lock (不适合生产环境)

--use-memory preparing    进程可以通过分配更多的内存来提高速度,这取决于系统的可用内存,默认值是100MB。总的来说分配的内存越多越好。

如果是从库,还可以加从库参数

--slave-info    备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0


恢复:


恢复第一步:应用日志。

#恢复前,要把旧的数据全部删掉
#先关闭当前的mysql
/etc/init.d/mysql stop
#删除配置文件指定的datadir的mysql数据目录
rm -rf /data/mysql/data/*
#执行第一步命令
innobackupex --defaults-file=****/my.cnf --apply-log --use-memory=4G /backup/备份目录

看到

completed OK!

就可以进行下一步


恢复第二步:拷贝文件。

#拷贝前要确认my.cnf指定的datadir是否为空,不为空会报错,刚才已经删除了
ll /data/mysql/data/
#执行拷贝命令
innobackupex --defaults-file=****/my.cnf --copy-back /backup/备份目录
#有些人喜欢把--apply-log的数据目录直接拷贝到datadir的目录,原则上是可以的,有兴趣可以试试

看到

completed OK!

数据还原就完毕了


命令参数说明:

--defaults-file=/etc/my.cnf    使用my.cnf文件,把需要恢复的文件恢复到my.cnf指定的位置,必须写在最前面,不然会报错。
--apply-log    应用备份时产生的日志,为整体拷贝恢复做准备
--copy-back    把完整备份文件拷贝到目标目录,由--defaults-file指定的my.cnf决定

--use-memory=4G    为了加快恢复速度,设置可用内存参数,可以不用


还有一些常用参数:

--databases    指定还原的数据库和某个库的表

--export    在--apply-log时使用,为每个InnoDB表创建一个以.exp结尾的文件,然后将你需要恢复的表的ibd和exp文件复制到目标机器,在目标机器上执行导入:mysql> create table t() engine=innodb; //此处需要DBA手动创建一个同结构的表或表已存在 mysql> ALTER TABLE t DISCARD TABLESPACE; $ cp t.ibd t.exp ${DATA_DIR}/${DB}/ mysql> ALTER TABLE t IMPORT TABLESPACE;相当于做了一次表空间传输,恢复了单表数据。


恢复第三步:修改文件权限。

因为一般操作恢复使用的用户是root,所以恢复回去后不会是mysql:mysql的权限,所以要改一下

#进入到data目录
cd /data/mysql
#更改权限
chown -R mysql.mysql data/
#最后启动一下
/etc/init.d/mysqld start
#启动之后和之前备份的库是一模一样的,用户也是


增量备份的方法:

增量备份需要基于全备,先假设我们已经有了一个全备(/backup/mysql-data/2016-05-10_09),在该全表的基础上做增量备份。

innobackupex --defaults-file=/****/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql-data/2016-05-10_09 --incremental /backup/mysql-data

其中

--incremental-basedir            指向全备目录,

--incremental                         指向增量备份的目录。


上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录,在该目录下存放着增量备份的所有文件。在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:

[plain]

backup_type = full-backuped

from_lsn = 0

to_lsn = 563759005914

last_lsn = 563759005914

基于该全备的增量备份的信息如下:

[plain]

backup_type = incremental

from_lsn = 563759005914

to_lsn = 574765133284

last_lsn = 574765133284

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。

而且还可以在增量备份的基础上再做增量备份

innobackupex --defaults-file=/*****/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql-data/2016-05-10_09 --incremental /backup/mysql-data

它的xtrabackup_checkpoints记录着备份信息如下:

[plain]

backup_type = incremental

from_lsn = 574765133284

to_lsn = 574770200380

last_lsn = 574770200950

可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。

增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志

增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志,如:

[plain]

innobackupex --apply-log --redo-only BASE-DIR

innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。

这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--use_memory提高性能。

以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。

第一步完成之后,我们开始第二步:回滚未完成的日志:

[plain]

innobackupex --apply-log BASE-DIR

上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:

[plain]

innobackupex --copy-back BASE-DIR

同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。