作者:Kevin Lewis 译:徐轶韬
在MySQL 8.0中创建常规表空间时,可以选择创建关联数据文件的目录。
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的重做日志中,恢复时需要依赖已知目录来查找和打开数据文件。
限制ADD DATAFILE路径可以使用户跟踪所有数据。用户可以指定数据的位置,并且数据不会丢失。
到MySQL 8.0.21为止,可以为隐式创建的file-per-table表空间指定任何目录:
CREATE TABLE table_name ({column_specs}) DATA DIRECTORY ‘/my/unknown/dir’;
执行此操作时,MySQL数据字典会知道数据文件的位置,但必须要等到数据字典恢复后才能找到。这意味着这些数据文件不可恢复。崩溃后,如果重做日志包含对这些文件的更改,则必须将这些数据文件目录添加到–innodb-directories,MySQL才能够启动。如果由于表空间尚未打开而无法应用重做日志,则恢复启动将失败。
因此,MySQL 8.0.21要求每个隐式的file-per-table数据文件都在一个已知目录中创建,就像普通表空间一样。该规则仅适用于新的隐式表空间。
那么现有数据库呢?如果隐式数据文件位于未知目录中,是否将阻止升级到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升级。