innobackupex是一个Perl脚本,封装了xtrabackup C程序,对innodb、xtradb存储引擎进行备份不会锁表,利用记录LSN的机制实现备份。
一、安装
系统:CentOS release 6.4 (Final)
1、安装依赖包
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel
2、安装xtrabackup
tar xvf percona-xtrabackup-2.0.8.tar.gz
cd percona-xtrabackup-2.0.8
AUTO_DOWNLOAD="yes" ./utils/build.sh innodb51 #针对不同版本的mysql自动下载相应的源码包
错误:
Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/innobackupex line 23.
BEGIN failed--compilation aborted at /usr/bin/innobackupex line 23.
解决:
yum -y install perl-Time-HiRes.x86_64
3、或直接使用rpm包安装
yum -y localinstall percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm
下载地址:
http://www.percona.com/downloads/XtraBackup/
二、备份需求权限
1、连接和文件权限
系统用户以及数据库用户,备份数据目录的读写权限。
--user、--password指定用户名和密码;
--port、--socket、--host:分别指定mysql实例的端口、socket、主机等
2、数据库用户权限
RELOAD 和LOCK TABLES:执行FLUSH TABLES WITH READ LOCK;
REPLICATION CLIENT:获得Bin Log的位置;
CREATE TABLESPACE:import表;
SUPER:在复制环境开启和停止slave线程。
如创建完全备份的权限:
mysql> CREATE USER 'backup'@'localhost' IDENTIFIED BY 'backup@123';
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
mysql> FLUSH PRIVILEGES;
三、创建完全备份
innobackupex是结合xtrabackup和tar4ibd的工具,提供统一的接口用来备份数据库的所有数据。
备份目录规划:
# tree /data/backup/physical/
/data/backup/physical/
├── full #存放完全备份文件
└── inc #存放增量备份文件
1、创建一个完全备份,默认只要指定一个备份数据存放目录
innobackupex --defaults-file=/opt/mysql/my.cnf --user=backup --password=backup@123 --host=localhost --port=3306 /data/backup/physical/full
注意:建议指定数据库配置文件,会去读取配置文件的datadir等选项,如没有指定,默认是备份/var/lib/mysql目录
使用xtrabackup备份所有innodb表,拷贝所有表定义文件,数据文件表(myisam、merge、csv、archive),以及触发器和数据库配置信息。
--no-timestamp:将不创建时间戳的目录,创建给定的目录
--defaults-file:指定配置文件,只能放在第一个参数
2、使用--apply-log合并日志,将提交的事务进行重做,将没有提交的事务进行回滚,确保数据文件的一致性
innobackupex --apply-log --use-memory=4G /data/backup/physical/full/2012-08-06_15-23-25/
--use-memory:默认100MB,决定于系统的可用和剩余内存,内存越大,将越快。
3、使用innobackupex从完全备份还原
--copy-back:执行还原到datadir,datadir必须为空,mysqld服务关闭,同时在恢复后需要修改目录权限。
innobackupex --copy-back /path/to/BACKUP-DIR
chown -R mysql:mysql /var/lib/mysql
--force-non-empty-directories:强制覆盖
四、使用innobackupex进行增量备份
一般情况下使用增量备份可以减少备份需求磁盘空间,减少备份时间。基于LSN,每次数据修改LSN将增加,拷贝所有LSN发生改变的页。
1、首先创建完全备份:
innobackupex --defaults-file=/opt/mysql/my.cnf --user=backup --password=backup@123 --host=localhost --port=3306 /data/backup/physical/full
2、创建第一个增量备份(基于完全备份),需指定BASEDIR(完全备份的目录):
innobackupex --defaults-file=/opt/mysql/my.cnf --incremental --user=backup --password=backup@123 --host=localhost --port=3306 /data/backup/physical/inc --incremental-basedir=/data/backup/physical/full/2012-08-06_15-23-25/
3、创建下一个增量备份(基于上一个增量备份),指定BASEDIR为上一个增量备份:
innobackupex --defaults-file=/opt/mysql/my.cnf --incremental --user=backup --password=backup@123 --host=localhost --port=3306 /data/backup/physical/inc --incremental-basedir=/data/backup/physical/inc/2012-08-06_15-29-03/
或者使用LSN(日志序列号),只拷贝大于指定序列号的:
innobackupex --incremental /data/backups --incremental-lsn=1291135
innobackupex --incremental /data/backups --incremental-lsn=1358967
这种方式只对XtraDB或InnoDB表,其他存储引擎的表将拷贝完整的文件;lsn可以在备份目录的xtrabackup-checkpoints查看to_lsn的值
4、合并增量备份
仅仅提交的事务必须在每个备份中重做,将合并完全备份和每个增量备份,必须最后回滚所有未提交的事务。
4.1 合并完全备份:务必使用--redo-only选项,强制xtrabackup跳过"rollback"
innobackupex --apply-log --redo-only /data/backup/physical/full/2012-08-06_15-23-25/
/data/backup/physical/full/2012-08-06_15-23-25/:为完全备份的目录BASEDIR
4.2 合并第一个增量备份到完全备份:
innobackupex --apply-log --redo-only /data/backup/physical/full/2012-08-06_15-23-25/ --incremental-dir=/data/backup/physical/inc/2012-08-06_15-29-03/
/data/backup/physical/full/2012-08-06_15-23-25/:为完全备份的目录BASEDIR
/data/backup/physical/inc/2012-08-06_15-29-03/:为第一个增量备份目录INCREMENTAL-DIR-1
这些路径一定要指定绝对路径,不然报错,找不到xtrabackup_logfile文件。
4.3 合并最后一个增量备份到完全备份:最后一个增量备份不需要加--redo-only
innobackupex --apply-log /data/backup/physical/full/2012-08-06_15-23-25/ --incremental-dir=/data/backup/physical/inc/2012-08-06_20-29-13/
/data/backup/physical/full/2012-08-06_15-23-25/:为完全备份的目录BASEDIR
/data/backup/physical/inc/2012-08-06_20-29-13/:为第二个增量备份目录INCREMENTAL-DIR-2
--redo-only只有除最后一个增量备份不使用。 如果最后一个也使用redo-only,将数据不是一致,因没有执行回滚。
4.4 一旦合并了完全备份和所有增量备份,就可以回滚没有提交的事务
该步骤是可选的,如果没有做,在数据库开启时会自动进行回滚没有提交的事务,同crash后恢复,但是做了准备,可以减少服务启动时间。innobackupex工具不会创建ib_log*文件,如要创建事务日志文件,需使用xtrabackup --prepare,否则在服务启动时进行创建。
innobackupex --apply-log /data/backup/physical/full/2012-08-06_15-23-25/
/data/backup/physical/full/2012-08-06_15-23-25/:为完全备份的目录BASEDIR
5、使用增量备份还原
准备好了增量备份,基本目录将包含完整的数据。
innobackupex --copy-back /data/backup/physical/full/2012-08-06_15-23-25/
然后修改文件权限
参考:
http://www.percona.com/doc/percona-xtrabackup/2.2/manual.html
来自为知笔记(Wiz)