TTL表的定义及创建

本文通过介绍TTL表的定义、创建、调整、删除,帮助您快速了解TTL表的基础操作。

前提条件

  • 实例版本要求如下:

    • 引擎版本为MySQL 5.7时,实例版本必须是polardb-2.4.0_5.4.19-20240927_xcluster5.4.19-20240920及以上。

    • 引擎版本为MySQL 8.0时,实例版本必须是polardb-2.4.0_5.4.19-20240927_xcluster8.4.19-20240924及以上。

    说明
  • TTL定义仅支持AUTO模式数据库的分区表(不包括使用Local Partition的分区表 )。

TTL定义说明

在数据库领域,TTL全称为“生存时间”(Time To Live),指的是数据在数据库中所能存储的时间长度。在这段时间之后,数据会被自动删除或标记为过期。TTL定义是一种在插入数据时设置其生命周期的方法,常用于管理需要自动过期的数据。

PolarDB-X 2.0的TTL定义由三部分组成,分别是TTL_EXPR、TTL_JOB(可选)、TTL_ENABLE(可选)。

TTL_EXPR

用于定义TTL表的时间列及其数据的存活时间。

  • 语法:

    TTL_EXPR = ttl_column EXPIRE AFTER ttl_interval_definition timezone_definition
    
    ttl_interval_definition:
      ttl_interval_num { DAY | MONTH | YEAR }
    
    timezone_definition:
      TIMEZONE time_zone_value
    说明
    • ttl_column:TTL表的时间列,只支持是Date、Datetime、Timestamp三种数据类型的列。

    • ttl_interval_definition:TTL表数据存活的时间,只支持DAY、MONTH、YEAR三种时间单位。即(now() - ttl_column)>ttl_interval_definition 时,对应数据将会被系统自动清理。

    • timezone_definition:TTL表的时区定义,对于一些时区敏感的数据类型(如Timestamp等),清理任务将会根据设置的时区来执行清理操作。

  • 示例:

    TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00'
    说明
    • date_field为TTL表的时间列。

    • 数据存活的时间为2个月(2 MONTH),基于TTL表的时间列,超过2个月的数据会过期。

    • 时区为东八区(+08:00)。

TTL_JOB

用于设置定时清理任务的执行计划(时间点和频率),默认值为 '0 0 1 */1 * ? *'( 每天在凌晨一点调用一次) 。

  • 语法:

    TTL_JOB = quartz_cron_expr_definition timezone_definition
    
    quartz_cron_expr_definition:
       CRON cron_expr_value
    
    timezone_definition:
      TIMEZONE time_zone_value
    说明

    quartz_cron_expr_definition : 系统清理任务的时间点和频率,使用QUARTZ框架的CRON表达式表示,该表达式由以下七部分组成:

    • 秒(0-59)

    • 分钟(0-59)

    • 小时(0-23, 用 * 表示每小时)

    • 日期(1-31)- 月份中的某一天 (用 * 表示每天)

    • 月份(1-12 或 JAN, FEB, MAR, APR, ...,DEC, 用 * 表示每月)

    • 星期中的日期(1-7 或 SUN, MON, TUE, WED, THU, FRI, SAT,1 代表星期日,?表示占位符不设置)

    • 年份(用 * 表示每一年)

    重要

    因为定时清理任务运行占用一定的资源,所以PolarDB-X 2.0不支持将定时任务的周期设置为分钟级或秒级,以防止清理任务运行过于频繁影响业务稳定性。

  • 设置定时清理任务每天凌晨2点调用一次,示例如下:

     TTL_JOB = CRON '0 0 2 */1 * ? *' TIMEZONE '+08:00'

TTL_ENABLE

TTL表的定时清理任务开关。

TTL_ENABLE = {'ON' | 'OFF'}
说明

该属性为可选,默认值为'OFF',即不开启定时清理任务。

创建TTL定义

已存在的表指定TTL定义

假设已存在如下结构的表my_ttl_tbl

CREATE TABLE `my_ttl_tbl` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`date_field` datetime DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`id`)
PARTITIONS 8;

通过以下ALTER语句,可以为my_ttl_tbl指定TTL定义:

ALTER TABLE my_ttl_tbl
MODIFY TTL
SET
TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00';
说明

指定my_ttl_tbl表的date_field列为TTL定义的时间列,只保存最近两个月的数据(数据过期时间为2个月),定时清理任务执行的时区为东八区。

新建表时指定TTL定义

创建如下结构的表my_ttl_tbl时指定TTL定义:

CREATE TABLE `my_ttl_tbl` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`date_field` datetime DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 TTL = TTL_DEFINITION ( TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00' ) 
PARTITION BY KEY(`id`)
PARTITIONS 8;
说明

指定my_ttl_tbl表的date_field列为TTL定义的时间列,只保存最近两个月的数据(数据过期时间为2个月),定时清理任务执行的时区为东八区。

调整TTL定义

新建表my_ttl_tbl时,指定TTL定义,并指定date_field为时间列:

CREATE TABLE `my_ttl_tbl` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`date_field` datetime DEFAULT CURRENT_TIMESTAMP,
	`create_date` datetime DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 TTL = TTL_DEFINITION ( TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00' ) 
PARTITION BY KEY(`id`)
PARTITIONS 8;

调整TTL列的列名

通过ALTER语句修改TTL定义,将之前的TTL定义的时间列date_field修改为了create_date

ALTER TABLE my_ttl_tbl 
MODIFY TTL
SET
TTL_EXPR = `create_date` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00';

调整数据存活时间

ALTER TABLE `my_ttl_tbl` 
MODIFY TTL
SET
TTL_EXPR = `create_date` EXPIRE AFTER 2 YEAR TIMEZONE '+08:00';
说明
  • 修改数据的存活时间为2年,即基于TTL定义的时间列,超过2年的数据将会过期。

  • 修改时必须显式指定TIMEZONE定义。

调整定时清理任务的执行计划

ALTER TABLE `my_ttl_tbl` 
MODIFY TTL
SET
TTL_JOB = CRON '0 0 3 */1 * ? *' TIMEZONE '+08:00';
说明
  • 修改定时清理任务的执行计划为CRON '0 0 3 */1 * ? *',即每天凌晨3点执行一次。

  • 修改时必须显式指定TIMEZONE定义。

调整定时清理任务的调度开关

ALTER TABLE `my_ttl_tbl` 
MODIFY TTL
SET
TTL_ENABLE = 'ON';
说明

默认情况下,TTL定义的清理任务的调度开关是关闭状态,即OFF。如果您需要开启该表的清理任务的自动调度,执行以上语句即可。

删除TTL定义

ALTER TABLE my_ttl_tbl REMOVE TTL;
重要

当该TTL表已经创建归档表时,不支持直接删除TTL定义,需要先手动删除归档表后,才能删除TTL定义。