1 首先记录开始的LSN(全备的话就是从0开始,增备的话从指定路径,或者从表中获取)并启动一个xtrabackup_log后台检测的 fork进程,实时检测mysql redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_log中,所以还原的时候为什么需要prepare就是这个原因,数据是非一致性的,还有部分在xtrabackup_log中。
2 复制innodb的数据文件和系统表空间文件idbdata1到对应的以默认时间戳为备份目录的地方(流式备份就没有这个目录咯,流式备份节约磁盘,边备份,边压缩)
3 复制结束后,执行flush table with read lock操作(5.7以及之前,数据库大杀器这个锁) 8.0使用备份锁,所以percona工具xtrabackup8.0只能备份mysql8.0
4 复制.frm .myd .myi文件
5 并且在这一时刻获得binary log 的位置
6 将表进行解锁unlock tables (8.0 使用 UNLOCK INSTANCE)
7 停止xtrabackup_log进程
为了获取非innodb表的一致性
5.7 使用 全局事务读 FTWRL (释放 unlock tables)
8.0 使用 FLUSH TABLES WITH READ LOCK LOCK INSTANCE FOR BACKUP 备份锁 (释放 UNLOCK INSTANCE。或者关闭会话)
相关文档:
percona 官网说明: https://www.percona.com/doc/percona-xtrabackup/8.0/how_xtrabackup_works.html xtr8 工作原理
mysql8.0 官网说明: https://dev.mysql.com/doc/refman/8.0/en/lock-instance-for-backup.html 备份锁讲解