数据归档 #
简介 #
SphereEx-DBPlusEngine 数据归档插件是一款用于将数据库中的历史数据进行归档的插件,支持将历史数据归档到指定的存储介质中,以减少数据库的存储压力,提高数据库的性能。
挑战和目标 #
数据库中的历史数据通常占据了大量的存储空间,而且这些历史数据通常不会被频繁访问,但是这些历史数据却会对数据库的性能产生影响。因此,将历史数据归档到指定的存储介质中,可以减少数据库的存储压力,提高数据库的性能。
目前 SphereEx-DBPlusEngine 数据归档插件所支持的数据库产品为 MySQL,具体支持版本如下。
| 数据库 | 版本支持 | |
|---|---|---|
| 1 | MySQL | 5.7.x ~ 8.x |
应用场景 #
- 数据库中的历史数据占据了大量的存储空间,但是这些历史数据不会被频繁访问。
- 数据库的性能受到历史数据的影响,需要将历史数据归档到指定的存储介质中,以提高数据库的性能。
使用限制 #
- 数据归档插件当前只支持 MySQL 数据库, 并且目前只支持删除归档数据,但是预留了接口,可以支持将归档数据备份到指定的存储介质中。
- 表结构需要满足数据库 partition 的相关要求,例如分区字段需要包含在主键和唯一键中
- 分区键仅支持 datetime、date 类型
- 分区键需要插入当前时间
原理介绍 #
通过为表设置归档规则,SphereEx-DBPlusEngine 利用数据库的 RANGE 分区特性可以灵活高效地对数据的生命周期进行管理。
- 采用底层表按照时间进行 RANGE 分区的方式来支持归档功能 (分区方式扩展为 SPI,未来可支持其它方式)
- 根据用户配置以及当前时间,通过定时任务来自动删除/备份过期的分区,创建提前分配的分区
下图展示了 t_order 表对应的分表 t_order_0 和 t_order_1 对应的实际分区,随着时间的流逝,自动删除/备份分区数据,创建分区的过程。

配置示例 #
YAML 配置 #
表 t_order 为例,配置归档规则,将表 t_order 按照 creation_date 字段进行时间分区,每个分区的时间间隔为 1 个月,保留 12 个分区,预分配 3 个分区,定时任务调度器为 timed_task_scheduler。
- !ARCHIVE
tables:
t_order:
archiveStrategy:
archiveColumns: creation_date
archiveAlgorithmName: time_partition
archiveScheduler: timed_task_scheduler
archiveAlgorithms:
time_partition:
type: SphereEx:DATETIME_PARTITION
props:
interval-unit: DAYS
interval-amount: 1
retain-amount: 5
pre-allocate-amount: 2
archiveSchedulers:
timed_task_scheduler:
type: SphereEx:TIMED_TASK
props:
schedule-cron-expr: "0/5 * * ? * *"
DistSQL 配置 #
- 创建归档规则
CREATE ARCHIVE RULE t_order (
ARCHIVE_STRATEGY (
ARCHIVE_COLUMNS = creation_date,
ARCHIVE_ALGORITHM (
TYPE (
NAME = "SphereEx:DATETIME_PARTITION",
PROPERTIES (
"interval-unit" = "DAYS",
"interval-amount" = 1,
"retain-amount" = 5,
"pre-allocate-amount" = 2
)
)
)
),
SCHEDULER_ALGORITHM (
TYPE (
NAME = "SphereEx:TIMED_TASK",
PROPERTIES ("schedule-cron-expr" = "0/5 * * ? * *")
)
)
);
SHOW ARCHIVE TABLE RULE t_order;
- 创建示例表
CREATE TABLE t_order (
order_id BIGINT,
user_id INT NOT NULL,
status VARCHAR(50) NOT NULL,
merchant_id INT,
remark VARCHAR(50) NOT NULL,
creation_date DATE NOT NULL,
PRIMARY KEY (order_id, creation_date)
);
show create table t_order;
- 插入示例数据
INSERT INTO t_order (order_id, user_id, status, merchant_id, remark, creation_date)
VALUES
(0, 100, 'Completed', 1000, 'Remark 0', CURDATE() - INTERVAL 5 DAY),
(1, 101, 'Pending', 1001, 'Remark 1', CURDATE() - INTERVAL 4 DAY),
(2, 102, 'Completed', 1002, 'Remark 2', CURDATE() - INTERVAL 3 DAY),
(3, 103, 'Canceled', 1003, 'Remark 3', CURDATE() - INTERVAL 2 DAY),
(4, 104, 'Processing', 1004, 'Remark 4', CURDATE() - INTERVAL 1 DAY),
(5, 105, 'Shipped', 1005, 'Remark 5', CURDATE());
select * from t_order;
select * from t_order partition(p20250112);
- 修改系统时间为一天后 再次查看底层表结构
select now();
show create table t_order;
- 查看最旧的示例数据被删除
select * from t_order;