#### 15.6.3.6 在服务器离线时移动表空间文件

这[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)变量定义了在启动时扫描表空间文件的目录，支持在服务器离线时将表空间文件移动或恢复到新位置。在启动期间，使用发现的表空间文件代替数据字典中引用的那些文件，并且更新数据字典以引用重定位的文件。如果扫描发现重复的表空间文件，则启动失败并显示错误，指示为同一表空间 ID 找到多个文件。

定义的目录[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir),[`innodb_undo_directory`](innodb-parameters.html#sysvar_innodb_undo_directory)， 和[`数据目录`](server-system-variables.html#sysvar_datadir)变量会自动附加到[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)参数值。这些目录在启动时被扫描，无论是否[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)设置是明确指定的。这些目录的隐式添加允许移动系统表空间文件、数据目录或撤消表空间文件，而无需配置[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)环境。但是，必须在目录更改时更新设置。例如，重定位数据目录后，您必须更新[`--数据目录`](server-system-variables.html#sysvar_datadir)在重新启动服务器之前进行设置。

这[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)变量可以在启动命令或 MySQL 选项文件中指定。引号用于参数值周围，因为分号 (;) 被某些命令解释器解释为特殊字符。（例如，Unix shell 将其视为命令终止符。）

启动命令：

```
mysqld --innodb-directories="directory_path_1;directory_path_2"
```

MySQL 选项文件：

```
[mysqld]
innodb_directories="directory_path_1;directory_path_2"
```

以下程序适用于移动个人[每表文件](glossary.html#glos_file_per_table)和[通用表空间](glossary.html#glos_general_tablespace)文件，[系统表空间](glossary.html#glos_system_tablespace)文件，[撤消表空间](glossary.html#glos_undo_tablespace)文件或数据目录。在移动文件或目录之前，请查看以下使用说明。

1.  停止服务器。

2.  将表空间文件或目录移动到所需位置。

3.  使新目录为人所知`InnoDB`.

    -   如果移动个人[每表文件](glossary.html#glos_file_per_table)要么[通用表空间](glossary.html#glos_general_tablespace)文件，将未知目录添加到[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)价值。

        -   定义的目录[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir),[`innodb_undo_directory`](innodb-parameters.html#sysvar_innodb_undo_directory)， 和[`数据目录`](server-system-variables.html#sysvar_datadir)变量会自动附加到[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)参数值，因此您无需指定这些。

        -   file-per-table 表空间文件只能移动到与模式同名的目录。例如，如果`演员`表属于`萨基拉`架构，然后`演员.ibd`数据文件只能移动到名为`萨基拉`.

        -   通用表空间文件不能移动到数据目录或数据目录的子目录。

    -   如果移动系统表空间文件、撤消表空间或数据目录，请更新[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir),[`innodb_undo_directory`](innodb-parameters.html#sysvar_innodb_undo_directory)， 和[`数据目录`](server-system-variables.html#sysvar_datadir)设置，根据需要。

4.  重新启动服务器。

##### 使用说明

-   通配符表达式不能用于[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)参数值。

-   这[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)scan 还遍历指定目录的子目录。从要扫描的目录列表中丢弃重复的目录和子目录。

-   [`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)支持移动`InnoDB`表空间文件。移动属于存储引擎以外的文件`InnoDB`不支持。此限制也适用于移动整个数据目录。

-   [`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)支持将文件移动到扫描目录时重命名表空间文件。它还支持将表空间文件移动到其他支持的操作系统。

-   将表空间文件移动到不同的操作系统时，请确保表空间文件名不包含禁止字符或在目标系统上具有特殊含义的字符。

-   将数据目录从 Windows 操作系统移动到 Linux 操作系统时，修改二进制日志索引文件中的二进制日志文件路径以使用反斜杠而不是正斜杠。默认情况下，二进制日志索引文件与二进制日志文件具有相同的基本名称，扩展名为 '`。指数`'。二进制日志索引文件的位置定义为[`--log-bin`](replication-options-binary-log.html#option_mysqld_log-bin).默认位置是数据目录。

-   如果将表空间文件移动到不同的操作系统会引入跨平台复制，则数据库管理员有责任确保正确复制包含特定于平台的目录的 DDL 语句。允许指定目录的语句包括[`创建表...数据目录`](create-table.html)和[`创建表空间...添加数据文件`](create-tablespace.html).

-   将使用绝对路径或在数据目录之外的位置创建的 file-per-table 和通用表空间的目录添加到[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)环境。否则，`InnoDB`在恢复期间无法找到文件。有关相关信息，请参阅[崩溃恢复期间的表空间发现](innodb-recovery.html#innodb-recovery-tablespace-discovery).

    要查看表空间文件位置，请查询[`INFORMATION_SCHEMA.FILES`](information-schema-files-table.html)桌子：

    ```
    mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES \G
    ```
