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

时间:2016-01-10 22:25:46

标签: mysql innodb percona

我在固态硬盘上运行MySQL,我即将耗尽空间。我的网站主机对SSD过度收费,而MySQL中的大部分数据都是“存档”数据(即未主动使用的数据)。我有更大的硬盘可以容纳这些数据。因此,我希望能够将特定的InnoDB表从SSD移动到HDD。

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

我也看到自5.6以来,MySQL支持DATA DIRECTORY命令:

  

在特定的表中创建新的InnoDB每表文件表空间   在MySQL数据目录之外的位置,使用DATA DIRECTORY =   CREATE TABLE语句的absolute_path_to_directory子句。

     

提前计划位置,因为您无法使用DATA   带有ALTER TABLE语句的DIRECTORY子句。你的目录   指定可以在具有特定性能的另一个存储设备上   或容量特性,例如快速SSD或高容量   HDD。

问题是,它似乎只支持 new 表。我想为现有表格做这件事。有关如何提示?我正在运行Percona MySQL,如果有帮助的话。

谢谢!

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

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

2 个答案:

答案 0 :(得分:1)

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

执行SHOW CREATE TABLE以获取当前定义。对其进行修改以添加DATA DIRECTORYINDEX_DIRECTORY。然后使用编辑后的文本创建新表。

然后INSERT INTO new_tbl SELECT * FROM real_tbl;并随机播放名称:RENAME TABLE real_tbl TO old_tbl, new_tbl TO real_tbl;

验证结果,最后验证DROP old_tbl;

答案 1 :(得分:1)

我自己处理过这个问题,最终找到了一个更优雅的解决方案,而不是创建新的 - 复制 - 切换':分离,移动和重新导入基础表空间文件。这在大型和/或重度索引的表上效率更高,因为MySQL不必重做它已经完成的工作。

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

<mat-form-field>
    <input matInput [matDatepicker]="picker" placeholder="Choose a date">
    <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
    <mat-datepicker #picker touchUi></mat-datepicker>
</mat-form-field>

在保持连接打开的同时,将表空间文件移到shell中:

FLUSH TABLES `table_name` FOR EXPORT;

现在回到MySQL发布锁,删除表,用正确的$ mv /var/lib/mysql/database_name/table_name.{ibd,cfg} ~ 重新创建它并丢弃其表空间:

DATA DIRECTORY

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

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;

导入它们:

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

更多背景和动机,为什么要创建新的 - 复制 - 切换&#39;效率低下可以在我写的关于这个主题的博文中找到:https://www.moxio.com/blog/28/moving-individual-mysql-tables-on-disk