14

我有一个表,如:如何在不丢失数据的情况下删除分区?

create table registrations( 
id int not null auto_increment primary key, 
name varchar(50), 
mobile_number varchar(13)) 
engine=innodb 
partition by range(id) (
partition p0 values less than (10000), 
partition p0 values less than (20000), 
partition p0 values less than max value); 

不完全一样,但上面类似的....

现在假设我的表有20万行,现在我想删除表中的分区和根据需要重新组织它们,而不需要MAX VALUE。

任何人都可以帮助我重新排列分区而不丢弃数据或丢弃表并重新创建它吗?

回答

7

可以使用ALTER TABLE .. REORGANIZE PARTITION命令重组分区p0

http://dev.mysql.com/doc/refman/5.5/en/partitioning-management-range-list.html

如果你打算改变一个表的分区,而不会丢失数据,使用ALTER TABLE ...重组​​PARTITION

ALTER TABLE registrations 
REORGANIZE PARTITION p0 INTO (
    PARTITION p0 VALUES LESS THAN (10000), 
    PARTITION p0 VALUES LESS THAN (20000) 
); 

注意,这将没有任何意义,直到你实际上创建了几个分区例如

ALTER TABLE registrations 
REORGANIZE PARTITION p0 INTO (
    PARTITION p0 VALUES LESS THAN (10000), 
    PARTITION p1 VALUES LESS THAN (20000), 
    PARTITION p2 VALUES LESS THAN MAXVALUE 
); 

看一看RANGE partitioning in MySQL

如果你的分区p2变得过大,你可以把它分解以同样的方式。

60
ALTER TABLE tbl REMOVE PARTITIONING; 
+0

这是正确的答案,请注意这一点。 –

+0

这应该是问题的正确答案。 – Sugan

1

重新排列分区不需要删除所有现有分区。您可以直接在ALTER TABLE语法中指定新的分区,并且不会丢失任何数据。

ALTER TABLE registrations 
PARTITION by RANGE(id) (
PARTITION p1 VALUES LESS THAN (10000), 
PARTITION p2 VALUES LESS THAN (20000), 
PARTITION p3 VALUES LESS THAN (30000), 
PARTITION p4 VALUES LESS THAN (40000), 
PARTITION p5 VALUES LESS THAN (MAXVALUE); 

P.S.经测试MySQL 5.7.11

相关问题