本文通过介绍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;