有近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操作只复制已更改的分区,不要接触不变的分区。