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