innodb_directories变量定义了在启动时扫描表空间文件的目录,支持在服务器脱机时将表空间文件移动或恢复到新位置。在启动期间,使用发现的表空间文件代替数据字典中引用的那些文件,并且更新数据字典以引用重新定位的文件。如果扫描发现重复的表空间文件,则启动失败并显示错误指示为同一表空间 ID 找到多个文件。
由innodb_data_home_dir、 innodb_undo_directory和datadir变量定义的目录会自动附加到 innodb_directories参数值。无论innodb_directories 是否明确指定设置,都会在启动时扫描这些目录。这些目录的隐式添加允许在不配置 innodb_directories设置的情况下移动系统表空间文件、数据目录或撤消表空间文件。但是,必须在目录更改时更新设置。例如,重新定位数据目录后,您必须在重新启动服务器之前更新--datadir设置。
innodb_directories变量可以在启动命令或 MySQL 选项文件中指定。引号用于标明参数值,因为分号 (;) 被某些命令解释器解释为特殊字符。(例如,Unix shell 将其视为命令终止符。)
启动命令:
mysqld --innodb-directories="directory_path_1;directory_path_2"
MySQL 选项文件:
[mysqld]
innodb_directories="directory_path_1;directory_path_2"
以下过程适用于移动单个独立表空间文件、通用表空间 文件、系统表空间文件、回滚表空间文件或数据目录。在移动文件或目录之前,请查看以下使用说明。
1、停止服务器。
2、将表空间文件或目录移动到所需位置。
3、使新目录被InnoDB识别。
如果移动单个独立表空间文件或通用表空间文件,请将未知目录添加到该innodb_directories值。
(1)由innodb_data_home_dir、 innodb_undo_directory和datadir变量定义的目录会自动附加到 innodb_directories 参数值,因此您无需指定这些。
(2)独立表空间文件只能移动到与模式同名的目录。例如,如果actor表属于 sakila模式,则 actor.ibd数据文件只能移动到名为 sakila的目录。
(3)通用表空间文件不能移动到数据目录或数据目录的子目录。
如果移动系统表空间文件、撤消表空间或数据目录,请根据需要更新 innodb_data_home_dir、 innodb_undo_directory和datadir设置。
4、重新启动服务器。
使用说明1、innodb_directories参数值中不能使用通配符表达式 。
2、针对innodb_directories的扫描还遍历指定目录的子目录。重复的目录和子目录会被扫描目录丢弃。
3、innodb_directories支持移动InnoDB表空间文件。不支持移动属于 InnoDB存储引擎以外的文件。此限制也适用于移动整个数据目录。
4、innodb_directories支持将文件移动到扫描目录时重命名表空间文件。它还支持将表空间文件移动到其他支持的操作系统。
5、将表空间文件移动到不同的操作系统时,请确保表空间文件名不包含禁止字符或在目标系统上具有特殊含义的字符。
6、将数据目录从 Windows 操作系统移动到 Linux 操作系统时,将二进制日志索引文件中的二进制日志文件路径修改为使用反斜杠而不是正斜杠。默认情况下,二进制日志索引文件与二进制日志文件具有相同的基本名称,扩展名为 ' .index'。二进制日志索引文件的位置由 --log-bin定义。 默认位置是数据目录。
7、如果将表空间文件移动到不同的操作系统会引入跨平台复制,则数据库管理员有责任确保正确复制包含特定于平台的目录的 DDL 语句。允许指定目录的语句包括 CREATE TABLE ... DATA DIRECTORY和 CREATE TABLESPACE ... ADD DATAFILE。
8、将使用绝对路径或在数据目录之外的位置创建的独立表空间和通用表空间的目录添加到 innodb_directories设置中。否则,InnoDB在恢复过程中无法找到文件。
9、要查看表空间文件位置,请查询 INFORMATION_SCHEMA.FILES表:
mysql>
SELECT TABLESPACE_NAME, FILE_NAME
FROM INFORMATION_SCHEMA.FILES \G