我在固态硬盘上运行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/'
答案 0 :(得分:1)
显然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
;
答案 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。