MYSQL备份恢复知识:第五章:备份原理
MYSQL备份分为逻辑备份和物理备份,本章,主要介绍的内容是物理备份。首先,我们先简要的说明关于逻辑备份的知识。逻辑备份,即导出,使用DUMP工具完成。DUMP从原理上分析,并不适合用于备份,只是一个数据导出工具。当数据量较大时,导出的耗时较长。如果需要导出一致数据,就需要长时间的表级锁。因此,在数据量较小的场景,或非备份用途的导出数据,可以使用此工具。MySQL自带命令MYSQLDUMP,输出文件为纯文本,包括DDL和DML Statement。mysqlpump为高级版本的dump工具,支持多线程等高级功能,并且包括权限的导出。mysqldump不关注引擎类型,它只是逻辑读数据,因此支持全部存储引擎环境,也包括NDB Cluster。
下面,我们开始介绍物理备份。
区别于逻辑备份,物理备份不仅对数据进行备份,也对整个数据库架构进行备份。恢复时,产生的目录与备份的源保持一致。
1 物理备份内容
1.1 备份过程
为了让读者更容易理解,我们通过一个示例图来说明备份的过程:
- 在t0时刻,开始了备份,将数据文件拷贝到备份存储中;
- 在t2时刻,数据文件拷贝结束。备份获得了全部的数据文件,但是它们不具备一致性;
- 在t3时刻,开始拷贝redo归档文件。如果没有开启归档,拷贝redo文件。拷贝的日志范围比数据文件要更延后一些,即比t2的时间点晚一点的t3;
- 在t4时刻,开始拷贝binary日志。拷贝的日志至少要包括t2到t3的范围,但是要比t3更延后一些至t4;
- 到t4时刻,一次完整的物理备份结束;
- 在此后的时刻,可以随时进行binary备份,用于PITR恢复
1.2 数据文件备份
MySQL数据库的数据文件,主要是表空间文件,可以直接采用文件拷贝的方式进行备份。在拷贝过程中,数据库有数据写入,因此备份的数据文件是不一致的。这就需要日志备份来配合。
1.3 REDO日志备份
为了保证数据100%的可恢复性,需要启用归档功能(8版本后支持)。尽管REDO日志可以配置为多个文件,并且可以设置非常大的容量,但是依然不能保证全部日志文件在备份前不会被覆盖。
例如,
没有开启归档,REDO日志文件有32个,从#ib_redo381到#ib_redo412。在备份数据文件开始时,相关的REDO信息记录在381中。由于数据库体量大、交易频繁,在数据文件备份结束时,#ib_redo381已经被循环利用,重新置成了#ib_redo413。在进行REDO日志备份时,只包含了#ib_redo382到#ib_redo413。因此,首先备份的数据文件,如果想到与后期备份的数据文件一致,所需的那部分日志所在的文件381已经丢失了。
还是这个场景,如果开始了归档,就不会存在这个问题。在数据文件备份开始前激活了REDO归档,从此该开始REDO会被同时写入指定的归档目录中,直到关闭了归档。因此,在整个备份过程中,所有生成的REDO都被保存在了指定的目录,不论REDO文件如何循环。
备份软件,例如MEB和xTraBackup,都会自动检测是否启用了归档。如果检测到已经启用,会自动在开始备份时激活归档,在备份结束时关闭归档。如果检测到归档没有启用,就会对REDO进行备份,但是不保证100%可恢复。
1.4 BINARY日志备份
日志文件是一系列连续的文件,文件编号持续增加,记录在INDEX文件中。备份以文件拷贝的方式,将全部或部分BINARY日志保存。虽然没有限制拷贝当前正在写入的日志,但是从文件系统调用的层面上看,还是尽量避免。BINARY文件编号最大的一个,是正在使用的,在这之前的编号都已经停止了写入。在备份前,使用FLUSH LOGS命令对日志进行更新,新的日志文件产生,这样包含所需数据的日志文件就停止了写入。例如,当前的日志文件是binlog.000010,如果对它进行备份,可能会对数据库有影响。执行FLUSH命令后,新的binlog.000011产生,binlog.000010停止写入,可以进行拷贝。
2 备份过程简述
2.1 一致性备份
所有非INNODB引擎,都需要使用一致性备份。
- 对数据库加表级锁,保证没有更新产生;
- 备份数据文件,可以是快照或文件拷贝方式。快照方式可以大幅缩短数据库加锁的时间,因此这类备份使用快照方式的较多;
- 在文件拷贝结束或快照结束后,关闭锁;
- 拷贝Binary日志
2.2 非一致性备份
只有InnoDB引擎支持。
- 打开实例锁;
- 激活Redo归档(8.0版本以后);
- 开始捕获Redo归档线程;
- 拷贝全部数据文件;
- 拷贝Binary日志;
- 关闭Redo归档;
- 关闭Redo归档捕获线程;
- 关闭实例锁;
2.3 混合备份
配置了包括InnoDB等多种引擎的场景。
- 获取InnoDB和non-InnoDB的数据文件列表
- 打开实例锁;
- 激活Redo归档(8.0版本以后);
- 开始捕获Redo归档线程;
- 拷贝全部InnoDB数据文件;
- 打开表级锁;
- 拷贝全部non-InnoDB数据文件;
- 拷贝Binary日志;
- 关闭Redo归档;
- 关闭Redo归档捕获线程;
- 关闭表级锁和实例锁;
CSDN视频课程:
https://edu.csdn.net/lecturer/8135?spm=1002.2001.3001.4144