在这篇文章中,大家将会了解XtraBackup的原理,以对每次备份和恢复的过程都心里有数,保持敬畏之心。
XtraBackup是Percona公司开源的一款MySQL InnoDB(包括XtraDB,MyISAM)数据库备份工具,基于InnoDB的崩溃恢复功能,由于支持不锁表的在线物理热备而被广泛应用于生产环境。
当InnoDB 启动时,它会检查redo log
事务日志并从中找到最后一次Checkpoint LSN
的位置,由此开始,将日志逐条应用于数据文件,直到最新的LSN
。
mysql> show engine innodb status;
---
LOG
---
Log sequence number 150487309917
Log flushed up to 150487301231
Pages flushed up to 150486653746
Last checkpoint at 150486653746
Last checkpoint at之后的数据还缓存在InnoDB Buffer Pool中,但日志已经记录,
InnoDB将日志 Last checkpoint at --> Log sequence number 应用于每张物理表。
1. 备份(--backup
)
在备份阶段,XtraBackup会创建两个线程
- thread1,InnoDB事务日志监控线程,用于循环复制文件中的新增日志
- thread2,MySQL数据库表复制线程,用于备份复制所有物理库表等文件
当thread2将所有物理文件复制完成之后,通知thread1停止监控事务日志。最终除了所有数据库相关的物理文件之外,生成xtrabackup_logfile, xtrabackup_checkpoints, xtrabackup_info
三个额外文件,XtraBackup用于备份恢复或搭建从库。
2. 准备(--prepare
)
在准备阶段,由于备份是将所有物理库表等文件复制到备份目录,而整个过程需要持续一段时间,在此期间,物理文件可能改变,这将导致最终备份结果处于不一致状态(所有文件不是处于同一个时间点)。
$ cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 150477836571
last_lsn = 150478402181
compact = 0
recover_binlog_info = 0
从文件中可以看出,备份开始前InnoDB最后一次checkpoint
是在to_lsn = 150477836571
位置,备份结束后InnoDB最后一次checkpoint
是在last_lsn = 150478402181
,因此,就需要xtrabackup_logfile(Redo Log)
将监控复制的所有事务日志to_lsn-->last_lsn
逐一应用(提交、回滚)到所有物理库表文件,从而达到最终一致性。
3. 恢复(--copy-back
)
在恢复阶段,所作的事情就很简单了,将所有备份文件复制到datadir
(前提是清空文件夹)中即可。