我在SSD上运行MySQL,我即将耗尽空间的SSD。我的used主机对SSD收费过高,MySQL中的大多数数据都是“归档”数据(即没有积极使用的数据)。我有更大的HDD可以保存这些数据。因此,我希望能够将特定的InnoDB表从SSD移动到HDD。
我已经考虑和研究过的一个解决方案是将特定表的单个.ibd文件(我已经启用了innodb_file_per_table )移动到HDD,然后是符号链接。然而,对此进行研究,对InnoDB来说似乎是个坏主意。
我还看到,从5.6开始,MySQL支持数据目录命令:
若要在InnoDB数据目录之外的特定位置创建新的每个表表空间,请使用create语句的数据目录= absolute_path_to_directory子句。 预先计划位置,因为不能在ALTER语句中使用数据目录子句。您指定的目录可能位于另一个具有特定性能或容量特性的存储设备上,例如快速SSD或高容量HDD。
问题是,它似乎只支持新表。我想为现有的桌子做这个。怎么做有什么建议吗?如果有帮助的话,我正在运行Percona MySQL。
谢谢!
更新:这里是我尝试过的,但是我得到了一个语法错误:
CREATE TABLE abc_2 LIKE abc ENGINE=InnoDB DATA DIRECTORY='/xxx/mysql/archive/'
发布于 2016-01-10 23:46:25
显然,CREATE ... LIKE ... DATA DIRECTORY ...是一个不受支持的组合。
执行SHOW CREATE TABLE以获得当前定义。编辑它以添加DATA DIRECTORY和INDEX_DIRECTORY。然后使用编辑的文本创建新表。
然后INSERT INTO new_tbl SELECT * FROM real_tbl;和洗牌名称:RENAME TABLE real_tbl TO old_tbl, new_tbl TO real_tbl;。
验证结果,最后进行DROP old_tbl;
发布于 2018-03-01 14:28:48
我自己解决了这个问题,最终找到了一个比“创建新拷贝开关”更优雅的解决方案:分离、移动和重新导入底层表空间文件。这在大型和/或索引较重的表上效率要高得多,因为MySQL不必重做它已经完成的工作。
简而言之,它可以归结为以下步骤:
FLUSH TABLES `table_name` FOR EXPORT;在保持连接打开的同时,将表空间文件移动到shell中:
$ mv /var/lib/mysql/database_name/table_name.{ibd,cfg} ~现在回到MySQL中,释放锁,删除表,用正确的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并进口:
ALTER TABLE `table_name` IMPORT TABLESPACE;更多的背景和动机,为什么‘创建新的复制开关’是低效的,可以在我写的关于这个主题的博客:https://www.moxio.com/blog/28/moving-individual-mysql-tables-on-disk。
https://stackoverflow.com/questions/34711518
复制相似问题