在一个驱动器上分布一个表的分区

有近10亿行,我们必须在SSD中拆分单独的分区,每个SSD中有大约4个分区。

表的当前模式:

CREATE TABLE IF NOT EXISTS `a` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `special_key` varchar(20) NOT NULL DEFAULT '0', `data1` varchar(20) NOT NULL, `data2` varchar(20) NOT NULL, `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`,`special_key`), UNIQUE KEY `special_key` (`special_key`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 PARTITION BY KEY (special_key) PARTITIONS 12; 

如果我们在开始分区的时候这样做了,那么这个命令看起来像这样:

 ALTER TABLE `a` partition by key(special_key) PARTITIONS 12 ( PARTITION p0 , PARTITION p1 , PARTITION p2 , PARTITION p3 DATA DIRECTORY='/media/p1/mysql_table_a', PARTITION p4 DATA DIRECTORY='/media/p1/mysql_table_a', PARTITION p5 DATA DIRECTORY='/media/p1/mysql_table_a', PARTITION p6 DATA DIRECTORY='/media/p1/mysql_table_a', PARTITION p7 DATA DIRECTORY='/media/p2/mysql_table_a', PARTITION p8 DATA DIRECTORY='/media/p2/mysql_table_a', PARTITION p9 DATA DIRECTORY='/media/p2/mysql_table_a', PARTITION p10 DATA DIRECTORY='/media/p3/mysql_table_a', PARTITION p11 DATA DIRECTORY='/media/p3/mysql_table_a', ); 

但是现在我们已经对这个表进行了分区,是否有办法让MySQL在不重新创build整个表的情况下“移动”特定分区?

手动复制&Symlinking这些表格可行,但这不是“正确的”方式 ,这会在任何进一步的修改中重置。

 ALTER TABLE `a` REORGANIZE PARTITION p0 INTO (PARTITION p0 DATA DIRECTORY='/media/p666/mysql_table_a'); 

你在找什么?

Docsbuild议在现有分区上运行应该是安全的,这意味着它不会重新分区整个表。

具有ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REBUILD PARTITION或REORGANIZE PARTITION的ALTER TABLE不会创build任何临时表(与NDB表一起使用除外); 但是,这些操作可以并且确实创build临时分区文件。

REORGANIZE操作只复制已更改的分区,不要接触不变的分区。