You need to enable JavaScript to run this app.
导航
自动归档冷数据
最近更新时间:2024.08.22 13:49:54首次发布时间:2024.06.26 12:45:22

本文介绍如何自动归档分区表的冷数据。

前提条件

方式一:配置定时执行的 DDL

可通过配置定时任务的方式,执行 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,这样能保证数据插入不会出错,起到兜底作用。
    

使用方式

  1. 实现分区自动扩展。

    • 语法

      call sys.bytendb_ps_extend_part('database_name', 'table_name', partition_type, gaps, partition_number);
      

      参数说明:

      参数名类型参数说明
      database_namevarchar数据库名称。
      table_namevarchar表名称。

      partition_type

      int

      分区类型,取值:

      • 0,按天分区。
      • 1, 按月分区。
      • 2,按年分区。
      gapsint多少个单元为一组,根据分区类型取值,比如 7 天,1 个月,2 个月,1 年等。
      partition_numberint需要扩展出的分区数量。
    • 示例

      -- 按照天为粒度,以 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);
      
  2. 将分区自动转换为冷分区。

    • 语法

      call sys.bytendb_ps_tier_part("database_name", "table_name", reserve_partition_number,tier_partition_number);
      

      参数说明:

      参数名类型参数说明
      database_namevarchar数据库名称。
      table_namevarchar表名称。
      reserve_partition_numberint需要保留的分区数量。
      tier_partition_numberint需要转换的分区数量。
    • 示例

      -- 保留最后 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 ;