MySQL 8.0.21中新的数据文件位置一致性

做者:Kevin Lewis 译:徐轶韬mysql

在MySQL 8.0中建立常规表空间时,能够选择建立关联数据文件的目录。sql

CREATE TABLESPACE tablespace_name ADD DATAFILE ‘/my/table/space/dir’;数据库

InnoDB必须知道该目录。目录由如下变量定义:datadir,  innodb_data_home_dir,  innodb_undo_directory   和  innodb_directories微信

启动时,InnoDB会首先搜索已知目录中的表空间数据文件,以后再进行恢复。因为表空间目录没有存储在MySQL 8.0的重作日志中,恢复时须要依赖已知目录来查找和打开数据文件。spa

限制ADD DATAFILE路径能够使用户跟踪全部数据。用户能够指定数据的位置,而且数据不会丢失。.net

到MySQL 8.0.21为止,能够为隐式建立的file-per-table表空间指定任何目录:日志

CREATE TABLE table_name ({column_specs}) DATA DIRECTORY ‘/my/unknown/dir’;orm

执行此操做时,MySQL数据字典会知道数据文件的位置,但必需要等到数据字典恢复后才能找到这意味着这些数据文件不可恢复。崩溃后,若是重作日志包含对这些文件的更改,则必须将这些数据文件目录添加到–innodb-directories,MySQL才可以启动。若是因为表空间还没有打开而没法应用重作日志,则恢复启动将失败。get

所以,MySQL 8.0.21要求每一个隐式的file-per-table数据文件都在一个已知目录中建立,就像普通表空间同样。该规则仅适用于新的隐式表空间。it

那么现有数据库呢?若是隐式数据文件位于未知目录中,是否将阻止升级到8.0.21?不,不会。

当InnoDB 8.0.21启动,在数据字典中找到未知目录中的数据文件时,它将警告写入错误日志。而后,用户能够将这些目录添加到–innodb-directories设置中。下次启动InnoDB时,用户的全部数据将可恢复。若是用户缺失目录,则会将另外一条消息写入错误日志。

这项新规则有几个小影响:

1.能够使用TRUNCATE TABLE截断隐式file-per-table表空间。这将隐式建立一个新的空表空间来替换旧的表空间。若是旧表空间是现有数据库的一部分,而且其目录未知,则不会在相同的未知目录中建立新表空间。它将在默认目录中为隐式表空间建立。也就是说,它是在datadir下以该模式命名的目录中建立。若是发生这种状况,会将如下警告消息写入错误日志:

“The DATA DIRECTORY location must be in a known directory. The DATA DIRECTORY location will be ignored and the file will be put into the default datadir location.”

2.选择惟一的撤消目录时,该目录不该用于常规表空间(常规表空间或隐式表空间)。MySQL 8.0.21不容许在其中建立常规或隐式表空间。但以前能够在惟一的撤消目录中建立非撤消表空间。若是使用先前的MySQL版本在惟一的撤销目录中建立了一些非撤消表空间,升级到MySQL 8.0.21后,InnoDB会容许它存在。

DATA DIRECTORY子句对隐式表空间目录的新限制旨在帮助确保数据库是彻底可恢复的。它只影响新的表空间,不影响现有的表空间。所以,它不阻止从旧版本的MySQL升级

感谢您关注“MySQL解决方案工程师”!


本文分享自微信公众号 - MySQL解决方案工程师(mysqlse)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。