DBAtlas · 数据库运维图谱

RANGE 分区维护:添加未来分区,归档/删除旧分区

MySQL分区

命令

-- Current partitions
SELECT PARTITION_NAME, PARTITION_DESCRIPTION, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'shop' AND TABLE_NAME = 'events_log' ORDER BY PARTITION_ORDINAL_POSITION;

-- Add a new month by splitting the empty pmax
ALTER TABLE shop.events_log REORGANIZE PARTITION pmax INTO (
  PARTITION p2026_11 VALUES LESS THAN ('2026-12-01'),
  PARTITION pmax VALUES LESS THAN (MAXVALUE));

-- Move the old month into an archive table (instant), then drop the empty partition
CREATE TABLE shop.events_log_2026_08 LIKE shop.events_log;
ALTER TABLE shop.events_log_2026_08 REMOVE PARTITIONING;
ALTER TABLE shop.events_log EXCHANGE PARTITION p2026_08 WITH TABLE shop.events_log_2026_08;
ALTER TABLE shop.events_log DROP PARTITION p2026_08;

-- Pruning check: the partitions column should list a single partition
EXPLAIN SELECT * FROM shop.events_log WHERE created >= '2026-10-01' AND created < '2026-11-01';

作用

在按日期进行 RANGE 分区的表上,添加下一周期的分区,通过 EXCHANGE 在毫秒级内将旧周期移到单独的表中,并以远低于 DELETE 的代价删除分区。

适用场景

用于日志、事件、审计记录等随时间增长的表的按月保留和归档。

注意

分区列必须包含在每个唯一键中(包括 PK)。REORGANIZE PARTITION pmax 会重写 pmax 中的数据;保持 pmax 为空并提前创建分区(如 3 个月)。DROP PARTITION 不可撤销,且不按行记录日志;在副本上以 DDL 形式执行。EXCHANGE 的目标表必须结构相同且未分区;超出范围的行会报错(WITHOUT VALIDATION 更快,但可能放入错误数据)。分区 DDL 会持有表级元数据锁。要实现分区裁剪,在 WHERE 中使用分区列时不要用函数包裹。

在 DBAtlas 中打开 →