XtraBackup备份MySQL

来源:互联网 发布:t型截面惯性矩的算法 编辑:程序博客网 时间:2024/05/22 04:04

出处:http://blog.itpub.net/29254281/viewspace-1082297/

XtraBackup是一款开源免费的MySQL热备份软件。
对于MyISAM,他使用锁机制进行全量备份。
对于InnoDB,他启用类似归档的方式,不仅可以进行全量备份,还可以进行增量备份。

全量备份大致过程如下,
首先,找到备份开始时检查点的LSN,复制此LSN之后的重做日志到xtrabackup_log。
然后,开始复制InnoDB的数据文件。
由于此时数据文件还在不断写入,而且重做日志文件可能被覆盖。所以XtraBackup有一个进程不断复制变化的重做日志到xtrabackup_log。这种方式参考Oracle归档模式的热备份。

但是还有一个问题,就是MySQL的数据块默认16K,而操作系统的块,windows默认为512字节,linux默认为1024字节。
很有可能在复制的过程中,MySQL块的若干操作系统块被更新,但是整个MySQL块却没有更新完成。这样会造成数据块的不一致。这种情况会影响重做日志的前滚恢复。

我猜测MySQL的处理方式是参考Oracle.如果一个MySQL块需要更新,则将这个块更新前的镜像同redo log一起写入重做日志文件。
数据恢复的时候,则使用重做日志文件中的数据块镜像apply redo log即可。

步骤3备份的是MyISAM表,采用了锁的机制。
在MyISAM表备份完成之后,解锁。此时,就是备份完成的时刻。
在MyISAM备份的过程中,InnoDB的redo log还是会不断的写入xtrabackup_log。

与Oracle不同的是,xtrabackup是先恢复再还原。
它的prepare过程,实际上就是Oracle对数据文件应用归档重做日志和联机重做日志的过程。
只不过xtrabackup将两种日志合并在了一个文件中(xtrabackup_log),并且他的归档日志仅仅包含从备份开始到MyISAM备份结束这一小段范围的重做日志。

在恢复的过程中,xtrabackup会启动内部的一个InnoDB实例(xtrabackup自带的),他根据备份的数据文件应用重做日志前滚数据,然后回滚未提交的数据。这个应该和Oracle是一样的。

回滚的过程

xtrabackup支持增量备份。
对于MyISAM来说,任何增量备份的操作都是一个全备.
而对于InnoDB,他会根据一个全量备份的LSN,拷贝数据文件中大于此LSN的数据块。

恢复增量备份时,先恢复全量备份,然后依次对增量备份进行恢复。


下面通过实验证明xtrabackup在拷贝文件的过程中会开启归档特性。

初始化实验表结构,并初始化4条数据.

create table test(a int primary key,b int,key(b)) engine=innodb;

  1. delimiter //
  2. Create Procedure insertrange(in s int,in e int)
  3. begin
  4. declare i int;    
  5. set i = s;
  6. start transaction;
  7. while i<e do
  8. insert into test values(i,i);
  9. set i=i+1;
  10. end while;
  11. commit;
  12. end
  13. //
  14. delimiter ;
call insertrange(1,5);
重做日志大小为5M


下面开启一个终端,使用insertrange过程插入100W条数据

同时启动另外一个终端,开始全量备份

备份过程会记录一个开始的检查点LSN

在备份的过程中,会不断将重做日志写入xtrabackup_log,类似归档日志的作用

备份非InnoDB数据

在非InnoDB数据备份之后,停止备份重做日志,备份结束.
1582081210应该就是备份结束的时间点,增量备份以这个LSN为基准。


值得注意的是备份的重做日志文件比MySQL设置的重做日志文件要大,证明了备份的过程如果发生了日志切换,会将归档的日志写入xtrabackup_log


xtrabackup的使用请参考:
http://blog.csdn.net/justdb/article/details/17054667

备份原理参考:
http://www.zrwm.com/?p=5844
http://www.baidu-ops.com/2013/05/26/xtrabackup/

0 0
原创粉丝点击