游戏开发工具

在《MySQL冷备份》一节我们介绍了冷备份主要通过复制相关数据文件来实现,下面主要介绍 MyISAM 和 InnoDB 存储引擎需要备份什么物理文件。

MyISAM存储引擎

MyISAM 存储引擎的所有数据默认存放在 C:/ProgramData/MySQL/MySQL Server 5.7/Data 路径下,即配置文件(my.ini或my.cnf)中 datadir 参数的值。


实际上不管我们使用的是 MyISAM 存储引擎还是其他存储引擎,每一个数据库都会在“datadir”目录下有一个文件夹(包括系统信息的数据库 mysql 也是一样)。

在各个数据库中每一个 MyISAM 存储引擎的表都会有 3 个文件存在,即记录表结构元数据的“.frm”文件,存储表数据的“.MYD”文件,存储索引数据的“.MYI”文件。

MyISAM 属于非事务性存储引擎,它没有自己的日志文件。所以 MyISAM 存储引擎的物理备份除了需要备份 MySQL 系统共有的物理文件之外,还需要备份上面的 3 种文件。

Innodb 存储引擎

Innodb 存储引擎属于事务性存储引擎,存放数据的位置也可能与 MyISAM 存储引擎有所不同,这主要取决于 Innodb 的相关配置。

指定 Innodb 存放数据和日志文件的位置参数为 innodb_data_home_dir、innodb_data_file_path 和 innodb_log_group_home_dir。以及决定 Innodb 的表空间存储方式参数 innodb_file_per_table,它决定 Innodb 是以共享表空间存放数据还是以独享表空间方式存储数据。

以上几个参数的相关使用说明我们在《MySQL InnoDB存储引擎》一节中做了相应的解释,在 MySQL 的官方手册中也有较为详细的说明,这里就不再赘述了。

如果使用的是共享表空间的存储方式,那么需要备份 innodb_data_home_dir 和 innodb_data_file_path 参数设定的所有数据文件,以及 datadir 中相应数据库目录下的所有 Innodb 存储引擎表的 .frm 文件。

而如果使用的是独享表空间,那么除了需要备份上面共享表空间方式所需要备份的所有文件之外,我们还需要备份 datadir 中相应数据库目录下的所有 .idb 文件,该文件中存放的才是独享表空间方式下 Innodb 存储引擎表的数据。

那么既然是使用独享表空间,为什么还要备份共享表空间“才使用到”的数据文件呢?其实这是很多人的一个共性误区,以为使用独享表空间的时候 Innodb 的所有信息就都存放在“datadir”所设定数据库目录下的“.ibd”文件中。实际上并不是这样的,“.ibd”文件中所存放的仅仅只是我们的表数据而已。

大家都很清楚,Innodb 是事务性存储引擎,它需要 undo 和 redo 信息,而不管 Innodb 使用的是共享还是独享表空间的方式来存储数据。与事务相关的 undo 信息以及其他的一些元数据信息,都是存放在 innodb_data_home_dir 和 innodb_data_file_path 这两个参数所设定的数据文件中的。所以要想 Innodb 的物理备份有效,就必须备份 innodb_data_home_dir 和 innodb_data_file_path 参数所设定的数据文件。

此外,除了上面所说的数据文件之外,Innodb 还有存放自己的 redo 信息和相关事务信息的日志文件在 innodb_log_group_home_dir 参数所设定的位置。所以要想 Innodb 物理备份能够有效使用,我们还必须要备份 innodb_log_group_home_dir 参数所设定的位置的所有日志文件。