本文介绍如何自动归档分区表的冷数据。
可通过配置定时任务的方式,执行 DDL 进行转换,实现自动归档冷数据。
DELIMITER || drop event if exists bytendb_ps_extend_part_event || create event bytendb_ps_extend_part_event on schedule EVERY 1 DAY STARTS date_add(date(ADDDATE(curdate(),1)),interval 1 hour) do BEGIN alter table table_name comment="storage_policy=cold"; END || DELIMITER ;
veDB MySQL 内置了一个存储过程,可以直接调用进行分区的自动扩展和转换。
仅分区表支持通过存储过程自动归档冷数据,且分区表必须满足以下要求:
分区表不能包含二级分区。
分区列为时间类型字段。
分区的基本粒度为日月年。
分区值满足以下要求。
part_old part_[yyyy][mm][dd] -- 如果按照具体的分区类型,存在不同的年、月、日的数据。 part_[yyyy][mm][dd] part_[yyyy][mm][dd] part_future -- MAXVALUE。最后一个分区的值,必须是 maxvalue,这样能保证数据插入不会出错,起到兜底作用。
实现分区自动扩展。
语法
call sys.bytendb_ps_extend_part('database_name', 'table_name', partition_type, gaps, partition_number);
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
database_name | varchar | 数据库名称。 |
table_name | varchar | 表名称。 |
partition_type | int | 分区类型,取值:
|
gaps | int | 多少个单元为一组,根据分区类型取值,比如 7 天,1 个月,2 个月,1 年等。 |
partition_number | int | 需要扩展出的分区数量。 |
示例
-- 按照天为粒度,以 1 天作为一个分区,扩展一个分区 call sys.bytendb_ps_extend_part('database_name', 'table_name', 0, 1, 1); -- 按照年为粒度,以 2 年作为一个分区,扩展一个分区 call sys.bytendb_ps_extend_part('database_name', 'table_name', 2, 2, 1);
将分区自动转换为冷分区。
语法
call sys.bytendb_ps_tier_part("database_name", "table_name", reserve_partition_number,tier_partition_number);
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
database_name | varchar | 数据库名称。 |
table_name | varchar | 表名称。 |
reserve_partition_number | int | 需要保留的分区数量。 |
tier_partition_number | int | 需要转换的分区数量。 |
示例
-- 保留最后 3 个有效分区,把下一个分区转冷 call sys.bytendb_ps_tier_part("database_name", "table_name", 3,1);
创建一个定时任务,实现分区的自动扩展和分区转换。
-- 对于非分片表,直接调用即可。 -- 对于分片表,需要包一层拉取所有分片的任务。 -- 每天凌晨一点,创建后续分区。 DELIMITER || drop event if exists bytendb_ps_extend_part_event || create event bytendb_ps_extend_part_event on schedule EVERY 1 DAY STARTS date_add(date(ADDDATE(curdate(),1)),interval 1 hour) do BEGIN -- 每天凌晨 1 点扩展一个新分区 call sys.bytendb_ps_extend_part("database_name", "table_name", 1, 1, 1); -- 每天凌晨 1 点 ,将昨天的老分区转为冷分区 call sys.bytendb_ps_tier_part("database_name", "table_name", 1, 1); END || DELIMITER ;