17.6.3.6 离线服务器时移动表空间文件
变量innodb_directories
,在启动时定义要扫描的目录,以便查找表空间文件,可以在服务器离线时移动或恢复表空间文件到新位置。在启动时,发现的表空间文件将被使用,而不是数据字典中所引用的文件,并且数据字典将被更新以引用 relocated 文件。如果扫描过程中发现重复的表空间文件,启动失败并显示错误信息,指出多个文件为同一个表空间 ID。
由innodb_data_home_dir
、innodb_undo_directory
和datadir
变量定义的目录将自动追加到innodb_directories
参数值中。这些目录在启动时无论是否指定了innodb_directories
设置都会被扫描。隐式地添加这些目录允许将系统表空间文件、数据目录或undo表空间文件移动到新的位置,而无需配置innodb_directories
设置。但是,需要在目录更改时更新设置。例如,在重新定位数据目录后,您必须更新--datadir
设置,然后重启服务器。
可以在启动命令或MySQL选项文件中指定innodb_directories
变量。因为某些命令解释器将分号 (;) 解释为特殊字符(例如,Unix shells将其视为命令终止符),因此使用引号 around the argument value。
启动命令:
mysqld --innodb-directories="directory_path_1;directory_path_2"
MySQL选项文件:
[mysqld]
innodb_directories="directory_path_1;directory_path_2"
以下过程适用于移动单个文件表和通用表空间文件、系统表空间文件、回滚表空间文件或数据目录。移动文件或目录前,请查看以下使用说明。
-
停止服务器。
-
将表空间文件或目录移到所需的位置。
-
使新目录被
InnoDB
知道。-
如果移动单个文件表或通用表空间文件,添加未知目录到
innodb_directories
值中。-
由
innodb_data_home_dir
、innodb_undo_directory
和datadir
变量定义的目录将自动添加到innodb_directories
参数值中,因此无需指定这些。 -
文件表空间文件只能移动到与架构同名的目录中。例如,如果
actor
表属于sakila
架构,那么actor.ibd
数据文件只能被移动到名为sakila
的目录中。 -
通用表空间文件不能移动到数据目录或数据目录的子目录中。
-
-
如果要移动系统表空间文件、undo 表空间文件或数据目录,需要更新
innodb_data_home_dir
、innodb_undo_directory
和datadir
设置,以适应需要。
-
-
重启服务器。
-
通配符表达式不能在
innodb_directories
参数值中使用。 -
InnoDB 目录扫描也会遍历指定目录的子目录。重复的目录和子目录将从要扫描的目录列表中被忽略。
-
innodb_directories
支持移动 InnoDB 表空间文件。移动属于其他存储引擎的文件(除了 InnoDB)不受支持。这一限制也适用于移动整个数据目录。 -
innodb_directories
支持将表空间文件重命名到扫描目录中,并且支持将表空间文件移动到其他支持的操作系统上。 -
当将表空间文件移动到不同操作系统时,确保表空间文件名称不包含禁止字符或在目标系统上具有特殊意义的字符。
-
当从 Windows 操作系统移动数据目录到 Linux 操作系统时,需要将二进制日志文件路径在二进制日志索引文件中修改为使用反斜杠而不是正斜杠。默认情况下,二进制日志索引文件的名称与二进制日志文件相同,但扩展名为 '
.index
'. 二进制日志索引文件的位置由--log-bin
定义。默认情况下,二进制日志索引文件位于数据目录中。 -
如果将表空间文件移动到不同操作系统引入跨平台复制,它是数据库管理员的责任确保正确地复制包含平台特定目录的 DDL 语句。允许指定目录的语句包括
CREATE TABLE ... DATA DIRECTORY
和CREATE TABLESPACE ... ADD DATAFILE
。 -
将使用绝对路径或位于数据目录外的文件-per-table 和 general 表空间的目录添加到
innodb_directories
设置中。否则,InnoDB
在恢复过程中无法找到文件。有关相关信息,请参见崩溃恢复期间表空间发现。查看表空间文件位置,可以查询信息_schema
FILES
表:mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES \G