如何将 InnoDB table 移动到另一个驱动器?

How to move InnoDB table to another drive?

我有 MySQL 运行 固态硬盘,我即将 运行 脱离 space 的固态硬盘。我的虚拟主机对 SSD 收费过高,MySQL 中的大部分数据是 "archived" 数据(即未被积极使用的数据)。我有更大的 HDD 可以保存这些数据。因此,我希望能够将特定的 InnoDB 表从 SSD 移动到 HDD。

我考虑并研究过的一个解决方案是将相关特定表的单个 .ibd 文件(我启用了 innodb_file_per_table)移动到 HDD,然后是符号链接。然而,研究这个,看起来这对 InnoDB 来说是个坏主意。

我也看到从5.6开始,MySQL支持DATA DIRECTORY命令:

To create a new InnoDB file-per-table tablespace in a specific location outside the MySQL data directory, use the DATA DIRECTORY = absolute_path_to_directory clause of the CREATE TABLE statement.

Plan the location in advance, because you cannot use the DATA DIRECTORY clause with the ALTER TABLE statement. The directory you specify could be on another storage device with particular performance or capacity characteristics, such as a fast SSD or a high-capacity HDD.

问题是,这似乎只支持 new 表。我想对现有表执行此操作。关于如何的任何提示?我是 运行ning Percona MySQL,如果有帮助的话。

谢谢!

更新:这是我尝试过的,但出现语法错误:

CREATE TABLE abc_2 LIKE abc ENGINE=InnoDB DATA DIRECTORY='/xxx/mysql/archive/'

显然 CREATE ... LIKE ... DATA DIRECTORY ... 是一个不受支持的组合。

执行 SHOW CREATE TABLE 以获取当前定义。编辑它以添加 DATA DIRECTORYINDEX_DIRECTORY。然后使用编辑的文本创建新的 table.

然后 INSERT INTO new_tbl SELECT * FROM real_tbl; 并洗牌:RENAME TABLE real_tbl TO old_tbl, new_tbl TO real_tbl;.

验证结果,最后DROP old_tbl

我自己处理过这个问题,最终找到了比'create new - copy - switch'更优雅的解决方案:分离、移动和re-importing底层的table空间文件。这在大型 and/or 重度索引 table 上效率更高,因为 MySQL 不必重做它已经完成的工作。

简而言之,它归结为以下步骤:

FLUSH TABLES `table_name` FOR EXPORT;

在保持连接打开的同时,将 tablespace 文件移动到 shell:

$ mv /var/lib/mysql/database_name/table_name.{ibd,cfg} ~

现在回到 MySQL 释放锁,用正确的 DATA DIRECTORY 删除 table,re-create 并丢弃它的 table 空间:

UNLOCK TABLES;
SHOW CREATE TABLE `table_name`;
DROP TABLE `table_name`;
CREATE TABLE `table_name` /* ... */ DATA DIRECTORY='/path/to/desired/location';
ALTER TABLE `table_name` DISCARD TABLESPACE;

现在将移动的table空间文件复制到所需位置:

$ cp -a ~/table_name.{ibd,cfg} /path/to/desired/location

并导入它们:

ALTER TABLE `table_name` IMPORT TABLESPACE;

关于为什么 'create new - copy - switch' 效率低下的更多背景和动机可以在我写的关于这个主题的博文中找到:https://www.moxio.com/blog/28/moving-individual-mysql-tables-on-disk