基于xtrabackup的Point-In-Time Recovery备份恢复
摘要:本文的目的是利用Xtrabackup工具,通过解析Binary log来实现Full-Backup,Incremental-Backup以及Point-In-Time Recovery.
一、Xtrabackup
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具Innodb Hotbakcup的一个很好的替代品。考虑到以前1.6版本增量备份的BUG(不能备份在增量期间的表结构,经测试这个BUG在2.0已经解决),以及游戏服务器的MYQL版本为Percona Server 5.5.15, 本文测试使用的是2.0版本. Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中xtrabackup只能备份InnoDB和XtraDB 两种数据表,innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。本文测试使用了innobackupex的完全备份、增量备份和 恢复。
Innobackupex完整备份后生成了几个重要的文件:
xtrabackup_binlog_info:记录当前最新的LOG Position
xtrabackup_binlog_pos_innodb:innodb log postion
xtrabackup_checkpoints: 存放备份的起始位置beginlsn和结束位置endlsn,增量备份需要这个lsn
二、测试环境
OS: Red Hat 4.1.2-52
Mysql: Server ver: 5.1.63
INNODB: innodb_data_file_pat | ibdata1:10M:autoextend
BINLOG:开启binlog日志,设置expire_logs_days=3,保留三天的Binlog,让mysql server自动维护Binlog日志文件。
考虑到公司172.16.10.24测试服务器硬盘只有10G,测试环境移到本机VM server上
三、备份
1)完整备份(Full Backup)
当前测试的服务器为三国游戏服,binlog在在测试服上原先没有开启,日志的大小暂时忽略,全库的大小约为3G
创建完整备份集
从/home/backup_data/full 目录中找到bakup.log文件可以看到整个执行过程约为6分钟
2)增量备份(Incremental Backup)
先在TEST库中创建一张USER_BAK表
再到tab表中插入几条数据
通过show binlog events 可以看到当前的END_LOG_POS为1285
执行增量备份
可以看到增量备份数很快,差不多1分半钟就完成了。
四、恢复数据库
重要 :拷贝DATADIR下的Binlog文件
[root@nod1 mysqldata]# cp mysql-bin* /home/backup_data/
1)恢复到在增量备份的时间点
按照以下步骤恢复数据库
1)service mysql stop #停止MYSQL服务
2) mv mysqldata /home/mysqldata_bak01 #移动原MYSQL目录
3) mkdir mysqldata #创建新DATADIR目录
4)innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /home/backup_data/full/2012-05-30_17-55-39 --user=root --password=aaaa1111 #Prepare完整备份集合
4)innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /home/backup_data/full/2012-05-30_17-55-39 --incremental-dir=/home/backup_data/incre/2012-05-30_18-17-07 --user=root --password=aaaa1111 #Prepare 增量备份集
5)innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup_data/full/2012-05-30_17-55-39 #执行恢复操作
6)chown -R mysql:mysql mysqldata #更改DATADIR目录属主
7)service mysql start #重启MYSQL服务
注意:xtrabackup全备不会备份Binlig文件集
登录MYSQL数据库
可以看到之前做的插入和创建表都恢复过来了
2)恢复到最新时间
利用完整备份和Innodb的binlog文件把数据库恢复到最新时间,可以保证因宕机引起的数据丢失最小化,下面是具体的操作步骤
由于之前的完整备份已经被增量备份日志做了应用,所以要重新做一个完整备份
执行上面步骤,备份完整数据库
Binlog position为567
这个pos也可以在FULL目录下的xtrabackup_binlog_info看到
更改数据库,分别执行,DELETE,UPDATE,INSERT,CREATE,DROP操作
备份binlog日志文件
停止Mysql数据库
删除原Datadir目录
创建Datadir目录
Prepare完整备份集
执行恢复操作
执行完成,完整备份恢复时间在4分钟左右
更改Datadir目录属主,启动数据库
登录数据库
解析BINLOG文件,从记录的position开始,对以后的数据库改动生成sql文本
执行文本
登入数据库检查
可以看到做的改动都更改过来了