如何删除分区而不丢弃MySQL中的数据?

时间:2013-01-07 08:05:31

标签: mysql sql database database-partitioning database-administration

我有一张表:

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);

不完全像上面那样但与......相似......

现在假设我的表有200000行,现在我想删除表上的分区,并根据需要重新组织它们,而不包含MAX VALUE。

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

4 个答案:

答案 0 :(得分:87)

ALTER TABLE tbl REMOVE PARTITIONING;

答案 1 :(得分:7)

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

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

  

如果您打算在不丢失数据的情况下更改表的分区,请使用ALTER TABLE ... REORGANIZE 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变得太大,你可以用同样的方式拆分它。

答案 2 :(得分:1)

如果要在保留分区的同时重新排列数据,请执行以下操作 你可以看看ALTER TABLE的REORGANIZE PARTITION和COALESCE PARTITION条款 命令。
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

答案 3 :(得分: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

进行测试