xtrabackup是percona公司开发的一个用于mysql物理热备的备份工具。
软件安装后一共有4个可执行文件:
innobackupex:perl脚本,用来备份非innodb表,同时会调用xtrabackup来备份innodb表,会和mysql server进行交互。如:加读锁(FTWRL),获取位点(show slave status)等。即封装了xtrabackup
xbcrypt:用来解密
xbstream:类似tar,一种支持并发写的流文件格式。和xbcrypt都在备份和解压会用到
xtrabackup:c/c++编译的二进制,用来备份innodb表,和mysql server没有交互
原理
通信方式:xtrabackup和innobackupex之间的交互和协调是通过控制文件的创建和删除来实现的。
主要文件:
xtrabackup_suspended_1
xtrabackup_suspended_2
xtrabackup_log_copied
例:看看备份时xtrabackup_suspended_2是怎么协调2个工具进程的:
1.innobackupex在启动xtrabackup进程后,会一直等xtrabackup备份完innodb文件,方式就是等待xtrabackup_suspended_2被创建出
2.xtrabackup备份完innodb数据后,就在指定目录下创建出xtrabackup_suspended_2,然后等到这个文件被innobackupex删除,
3.innobackupex 检测到文件 xtrabackup_suspended_2 被创建出来后,就继续往下走;
4.innobackupex 在备份完非 InnoDB 表后,删除 xtrabackup_suspended_2 这个文件,这样就通知 xtrabackup 可以继续了,然后等 xtrabackup_log_copied 被创建;
5.xtrabackup 检测到 xtrabackup_suspended_2 文件删除后,就可以继续往下了。

备份过程图

说明:
1.innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待 xtrabackup 备份完 ibd 数据文件;
2.xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。
3.xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);
4.innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。
5.当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);
6.xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex redo log 拷贝完成(通过创建文件);
7.innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;
8.最后 innobackupex 和 xtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。
在备份进程中都是直接通过操作系统读取数据文件的,只在执行SQL命令时和数据库有交互,基本不会影响数据库的运行,在备份非innodb时会有一段时间只读,对备份innodb表时完全没有影响。
备份innodb文件和非innodb都是通过拷贝文件,但实现的方式不一样,innodb是以page粒度(xtrabackup),在读取每个page时会检验checksum值,保证数据块是一致的;非innodb是cp或者tar(innobackupex),由于对文件做了FTWRL,磁盘上的文件也是完整的,备份的数据也是完整的。
增量备份
xtrabackup支持增量备份,但是只对innodb做增量。
原理:innodb每个page都有LSN号,lsn是全局递增的,page被更新时会改变当前的LSN号,page中的LSN越大,说明当前page越新。每次备份会记录当前备份到的LSN。增量备份只拷贝LSN大于上次备份的,比上次备份小的跳过,每个ibd文件最终备份出来的是增量delta文件
myisam没有增量机制,每次备份都是全部拷贝出
增量备份和全量备份不同之处在于idb文件的拷贝上。
恢复过程
恢复备份集和mysqld启动类似,就是mysqld crash之后做了一次crash recover
恢复目的:把备份集中的数据恢复到一个一致性位点(备份集对应的一致点就是备份时FTWRL的时间点),恢复出来的数据就对应原数据库FTWRL时的状态。
恢复过程只涉及 InnoDB 文件的恢复,非 InnoDB 数据是不动的(因为备份时 FTWRL 后,数据库是处于只读的,非 InnoDB 数据是在持有全局读锁情况下拷贝的,所以非 InnoDB 数据本身就对应 FTWRL 时间点;InnoDB 的 ibd 文件拷贝是在 FTWRL 前做的,拷贝出来的不同 ibd 文件最后更新时间点是不一样的,这种状态的 ibd 文件是不能直接用的,但是 redo log 是从备份开始一直持续拷贝的,最后的 redo 日志点是在持有 FTWRL 后取得的,所以最终通过 redo 应用后的 ibd 数据时间点也是和 FTWRL 一致的),备份恢复完成后,就可以把数据文件拷贝到对应的目录,然后通过mysqld来启动了。
译者介绍:家华,从事mysqlDBA的工作,记录自己对mysql的一些总结