【mysql表分区系】记一次错误的在原分区表追加表分区

文章描述了一次在MySQL5.7版本中错误地使用ALTERTABLE添加分区导致原有分区丢失的问题。错误的SQL语句覆盖了原有的分区。解决方案包括清除分区并重新创建,或者使用REORGANIZEPARTITION来拆分和重组分区。正确的追加分区方式应使用ADDPARTITION语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先声明下我这边使用的mysql版本是5.7.29版本,当然下面的问题我这边也是基于这个版本。这里因为没有考证其他版本是否也会有这些问题,可自行官方文档来查阅资料

需求

现在有个order表,以前已经创建过分区,但是随着时间的推移,我们需要在原有表的基础上面来添加新的分区

下面是之前创建分区的sql

alter table `order`  partition by range (TO_DAYS(CREATE_TIME)) (
 
	partition p_202202 values less than (TO_DAYS('2022-03-01')),
	partition p_202203 values less than (TO_DAYS('2022-04-01')),
	partition p_202204 values less than (TO_DAYS('2022-05-01')),
	partition p_202205 values less than (TO_DAYS('2022-06-01'))
);

我们看下创建后数据存储的效果

再看下表分区的信息

SELECT
    PARTITION_NAME,
    PARTITION_METHOD,
    PARTITION_EXPRESSION,
    PARTITION_DESCRIPTION,
    FROM_DAYS(PARTITION_DESCRIPTION),
    TABLE_ROWS,
    SUBPARTITION_NAME,
    SUBPARTITION_METHOD,
    SUBPARTITION_EXPRESSION 
FROM
    information_schema.PARTITIONS 
WHERE
    TABLE_SCHEMA = SCHEMA () 
    AND TABLE_NAME = 'order';

 

 查询看下之前创建分区有多少条数据 看到执行结果为2894

select  count(*)  from `order`  PARTITION (p_202202,p_202203, p_202204,p_202205);

请注意了,错误的做法来了

错误的执行sql

业务在增长,这个时候有人使用下面的语句做了增加分区

alter table `order`  partition by range (TO_DAYS(CREATE_TIME)) (
 
	partition p_202302 values less than (TO_DAYS('2023-03-01')),
	partition p_202303 values less than (TO_DAYS('2023-04-01')),
	partition p_202304 values less than (TO_DAYS('2023-05-01')),
	partition p_202305 values less than (TO_DAYS('2023-06-01')),
	partition p_202306 values less than (TO_DAYS('2023-07-01'))
);

我们看下存储数据的效果

 再看下表分区的信息

SELECT
    PARTITION_NAME,
    PARTITION_METHOD,
    PARTITION_EXPRESSION,
    PARTITION_DESCRIPTION,
    FROM_DAYS(PARTITION_DESCRIPTION),
    TABLE_ROWS,
    SUBPARTITION_NAME,
    SUBPARTITION_METHOD,
    SUBPARTITION_EXPRESSION 
FROM
    information_schema.PARTITIONS 
WHERE
    TABLE_SCHEMA = SCHEMA () 
    AND TABLE_NAME = 'order';

 玩篓子了,原来分区不见了,直接新分区将之前的干掉了。看到效果直接将我们之前创建的旧分区合并到p_202302这个分区下面了

怎么拯救呢?

这里有两个办法

  • 清空分区创建,直接重新创建分区吧
alter table  `order` remove partitioning;
  • 使用我们的拆分分区的办法来操作,我们将p_202302拆分为多个子分区来完成
ALTER TABLE `order` REORGANIZE PARTITION p_202302 INTO (
    PARTITION p_202202 VALUES LESS THAN (TO_DAYS('2022-03-01')),
    PARTITION p_202203 VALUES LESS THAN (TO_DAYS('2022-04-01')),
	PARTITION p_202204 VALUES LESS THAN (TO_DAYS('2022-05-01')),
    PARTITION p_202205 VALUES LESS THAN (TO_DAYS('2022-06-01')),
	PARTITION p_202206_202302 VALUES LESS THAN (TO_DAYS('2023-03-01'))
		
);

正确追加分区

使用 add  partition 语法 来追加分区

alter table `order`  add  partition  (
	partition p_202307 values less than (TO_DAYS('2023-08-01')),
	partition p_202308 values less than (TO_DAYS('2023-09-01'))
);

当然如果之前创建分区的时候使用过less than MAXVALUE  这种对于后续增长的数据,我们可以使用拆分分区的方式

-- otherPartition 这个就是使用less than MAXVALUE 的分区名称

ALTER TABLE test_order REORGANIZE PARTITION otherPartition INTO (
    PARTITION p_202307 VALUES LESS THAN (TO_DAYS('2023-08-01')),
    PARTITION p_202308 VALUES LESS THAN (TO_DAYS('2023-09-01'))
);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值