将表的分区分布在多个驱动器上

将表的分区分布在多个驱动器上

由于数据接近十亿行,我们必须将其拆分成跨 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“移动”特定的分区而不重新创建整个表?

手动复制和符号链接这些表是可行的,但这不是'正确的方法并且这将在任何进一步的改变上被重置。

答案1

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

你在找什么?

文档建议在现有分区上安全运行,这意味着它不会对整个表进行重新分区。

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

...

REORGANIZE 操作仅复制已更改的分区,而不会触及未更改的分区。

相关内容