首先,来描述一下XtraBackup的工作流程。在工作过程中,innobackupex会和xtrabackup协同工作,共同完成备份任务。
流程:
1.innobackupex启动后,首先通过start_ibbackup()函数中的fork方式创建xtrabackup进程并且启动。然后等待xtrabackup完成InnoDB相关文件的备份。
2.innobackupex通过wait_for_ibbackup_suspend(suspend_file)检测xtrabackup_suspended_2文件是否存在,如果检测到该文件,innobackupex进程就会被唤醒。
3.xtrabackup在备份InnoDB相关文件时,会开启如下两种线程。
–ibd复制线程,负责复制ibd文件。
–redo log复制线程,负责复制redo log信息。xtrabackup首先启动redo log复制线程,从最近的checkpoint点开始顺序复制redo log;然后启动ibd复制线程,在xtrabackup复制ibd的过程中,redo log复制线程一直工作,并且innobackupex进程处于等待状态,等待被xtrabackup进程唤醒。
4.xtrabckup复制ibd完成后,通知innobackupex进程(通过创建xtrabackup_suspended_2文件方式),同时自己进入等待状态,但是redo log复制线程依然在工作。
5.innobackupex收到通知,会执行备份锁(LOCK TABLESFORBACKUP),取到一致性的位点,然后开始复制非InnoDB文件。
6.当非InnoDB文件复制完成后,innobackupex开始执行LOCKBINLOG FORBACKUP,开始通过get_mysql_master_status($con)函数来获取Binlog位置。
7.然后创建xtrabackup_binlog_info文件,通过w rite_to_backup_file(binlog_info,join("\t", @binlog_info_content)."\n")函数将Binlog的位点信息写入文件中。
8.接着发起一个通知给xtrabackup进程(通过删除xtrabackup_suspended_2的方式),同时自己进入等待状态。
9.xtrabackup收到通知后,就会停止redo log复制线程,告知innobackupex,redo log复制完成,然后通知innobackupex(通过创建xtrabackup_log_copied文件的方式)。
10.innobackupex收到通知后,就开始释放锁资源(UNLOCKBINLOG和UNLOCKTABLES)。
11.随后,innobackupex和xtrabackup进行后期工作,比如资源的释放、备份元数据信息、打印备份目录、备份Binlog的位置信息,以及写入xtrabackup_info文件信息等。
12.最后,innobackupex等待xtrabackup进程结束后退出。
总结:
1.在备份的过程中,需要复制redo log,是由于备份ibd文件的过程中该文件可能被修改,这样备份出来的文件就可能是有脏数据的。那么在恢复时,需要通过redo log进行数据恢复,即应用已经提交的事务,回滚那些未提交的事务。
2.在备份中严重依赖于xtrabackup_suspended_2和xtrabackup_log_copied文件,如果在备份过程中,人为地删除了该文件或创建了任何一个文件,都会导致备份出现错误。因为innobackupex与xtrabackup进程之间的交互是通过这两个文件进行的。
3.如果是增量复制,还存在xtrabackup_suspended_1文件,作用是一样的。
xtrabackup备份流程
最新推荐文章于 2024-07-01 18:25:55 发布