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

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

首先声明下我这边使用的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'))
);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL动态追加分区是指在已有分区表的基础上,根据需要动态地向追加新的分区MySQL支持分区表分区表将数据根据特定的规则划分为多个分区,可以提高查询性能、提升数据管理灵活性。当数据量逐渐增大,先的分区可能无法满足需求,这时就需要动态地追加新的分区。 实现MySQL动态追加分区的步骤如下: 1. 确定需要追加分区名和分区字段。 2. 创建一个新的分区表结构与相同,但不包含任何数据。 3. 设计并执行一个ALTER TABLE语句,在上添加新的分区。 例如,假设有一个名为orders的分区表,按照日期分区,并且已经存在了2020年的分区。现在需要动态追加2021年的分区,可以按照以下步骤进行: 1. 确定名为orders,分区字段为order_date。 2. 创建新的分区表new_orders,具有与orders相同的结构。 3. 使用ALTER TABLE命令,执行类似如下的语句将2021年的分区追加上: ALTER TABLE orders ADD PARTITION (PARTITION p2021 VALUES LESS THAN ('2022-01-01')); 这样,就成功地将2021年的分区动态地追加到了中。可以根据具体的需求,设计不同的分区规则,追加不同的分区。 需要注意的是,动态追加分区可能会导致锁定和性能下降,因此,在进行分区表设计时要考虑到分区字段的选择、分区数的划分以及合理的时间间隔,以确保统的稳定性和高性能的运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值