今天,简单学习一下xtrabackup完全备份的流程。xtrabackup的完全备份大致可以分为7个步骤,如下,其中第二,第三个步骤可以同步进行:
第一步:根据连接信息连接MySQL:innobackupex在开始备份时,先使用指定的账号和密码连接MySQL,主要用于后期在备份过程中执行加锁,解锁,刷新redo等与数据库进行交互操作。第二步:复制redo文件到xtrabackup_logfile中:xtrabackup线程会读取--defaults-file选项指定的配置文件,解析innodb_data_home_dir和innodb_log_group_home_dir等系统参数,找到数据表空间和redo日志文件的位置,创建xtrabackup_logfile文件,模拟MySQL实例方式,以读写模式打开并读取redo日志,检查当前检查点,从当前检查点位置开始复制redo日志,同时持续扫描redo日志,有新产生的redo日志数据就复制到xtrabackup_logfile文件中,在整个备份工程中会一直复制redo日志。第三步:复制数据共享表空间及独立表空间文件:在复制redo日志的同时,另外一个线程会调用xtrabackup命令开始复制数据文件,会复制共享表空间文件和独立表空间文件,等同于获取了redo日志,undo日志,数据文件,但是不包含内存中的脏页数据,内存中的脏页数据可直接通过redo日志来恢复。第四步:执行FLUSH TABLES WITH READ LOCK加S锁:执行FLUSH TABLES WITH READ LOCK语句添加全局S锁,防止读取数据时发生DDL操作,同时获取binlog文件位置,此时数据库处于不可写状态,redo日志也会暂时卡在这里。第五步:复制表结构文件并获取binlog日志位置:完成加锁后,会开始复制表结构文件,对于InnoDB表来说,这个很快,但是对于MyISAM表,会一直锁表到文件复制完成且获取binlog文件之后才会解锁。第六步:持久化redo日志并复制,停止复制后解锁表:执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS语句将InnoDB层的redo日志持久化到磁盘后进行复制,在Xtrabackup2.2.3前,可能会出现丢失redo日志的情况,导致恢复后丢失redo日志中的数据,从而主从复制同步出错,然后停止读redo日志复制的线程。当redo日志的复制线程停止后,执行UNLOCK TABLES语句解锁表。第七步:完成收尾工作,释放资源并退出备份进程:innobackup完成收尾工作,如释放资源,记录与备份相关的元数据信息等,如backup-my.cnf,xtrabackup_info文件等,然后退出innobackupex备份进程。以上即为xtrabackup完全备份的整个流程,备份完成后,可以进行数据恢复操作。第一步:应用redo日志及undo日志:xtrabackup会启动一个mini instance,即最小化数据库实例,把数据文件复制到内存中,然后再读取xtrabackup_log中的redo日志进行应用,对于没有提交的事务使用undo日志进行回滚。第二步:执行crash recovery操作以实现一致性位点:innobackupex命令执行备份恢复的过程和mysqld进程启动过程很相似,在使用innobackupex命令执行备份恢复的过程中会做一次crash recovery操作,其目的是把备份数据恢复到一个一致性位点。第三步:备份恢复完成后启动mysql服务:备份时执行FTWRL后,数据库处于只读状态,非InnoDB表在持有全局读锁的情形下进行复制,因此本身就对应于FTWRL的时间点,InnoDB的.ibd文件复制是在FTWRL之前做的,复制出来的不同.ibd文件最后更新时间不一样,该状态的.ibd文件是不能直接使用,最终还需要通过redo日志应用后才可使用。回复完成后便可通过mysqld启动。
原文作者:DBA修行之路;如有侵权,请联系管理员删除。