天天看点

逻辑备份mysqldump—mydumper和物理备份xtrabackup的原理解析

参考网上找的一张图,可以大概理解其过程。

逻辑备份mysqldump—mydumper和物理备份xtrabackup的原理解析

flush /!40101 local / tables ####closes all open tables, forces all tables in use to be closed, and flushes the query cache.

flush tables with read lock ####调用ftwrl,加全局读锁,禁止全局读写,和第一步有点重复,但是当有第一个flush tables执行的时候,如果有一个长事务的update存在的时候,第一个flush tables并不会锁住整个mysql,而当长事务执行完成后,ftwrl会很快执行,所以第一个flush tables的存在是很有必要性的,使mysql加锁更加层次化,避免长时间阻塞mysql执行线程。

set session transaction isolation level repeatable read ####设置当前会话级别的事务隔离级别为rr,可重复读。可以避免不可重复读和幻读。

start transaction /!40100 with consistent snapshot / ####开启事务并获取一致性快照,获取db的一致性状态,有mysqldump参数--single-transaction决定,仅支持innodb引擎。

show master status ####由参数 --master-data决定,可以显式或者注释方式记录master的binlog信息,包括master log file和master log pos俩个指标。

unlock tables ####释放全局读锁

show databases 获取全部库开始循环,备份第一个库,建库语句show create database 后 savepoint sp 因为通过前面的一致性快照只能做到全局的commit和rollback,这里针对每个库存储point点位方便备份完单表后初始化回到之前savepoint点位。这样做不会堵塞已经备份的表的ddl操作。同时执行show tables获取库下全部表,循环执行,其中表备份show create table记录建表语句,及表数据备份为insert values,语句为select /!40001 sql_no_cache / * from table_name;一般会加主键限制每次数量级。

commit关闭一致性快照事务。

mydumper和mysqldump原理类似,最大的区别在于多线程复制。并发的粒度可以到行级别,还是通过线程分别调用ftwrl并获取一致性点位。

逻辑备份mysqldump—mydumper和物理备份xtrabackup的原理解析

percona xtrabackup(简称pxb)是 percona 公司开发的一个用于 mysql 数据库物理热备的备份工具,支持 mysql(oracle)、percona server 和 mariadb。

逻辑备份mysqldump—mydumper和物理备份xtrabackup的原理解析

1.innobackupex在执行后会fork一个xtrabackup的进程,然后就等待xtrabackup的ibd数据文件。

2.xtrabackup在备份innodb相关数据会启动俩个线程进行备份,一个是redo拷贝线程,负责拷贝redo文件在备份开始后新产生的数据文件。redo线程只有一个,在ibd拷贝线程之前启动,在ibd拷贝线程结束后结束。xtrabackup进程开始执行后,先启动redo拷贝线程,从最新的checkpoint点开始顺序拷贝redo日志;然后再启动ibd数据拷贝线程,在xtrabackup拷贝ibd过程中,innobackupex进程一直处于等待状态(等待文件被创建)。

3.xtrabackup拷贝完成ibd后,通知innobackupex(通过创建文件),同时自己进入等待(redo线程仍然进行拷贝);

4.innobackupex收到xtrabackup通知后,执行flush tables with read lock(ftwrl),去的一致性点位,开始拷贝非ibd文件可选copy或者rsync方式俩种,拷贝非 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 子进程结束后退出。

继续阅读