TTL使用说明

更新时间:2025-01-17 06:47:50

本文介绍了PolarDB MySQL的过期数据清理功能。

版本限制

适用的数据库引擎版本为MySQL 8.0.2,且小版本需为8.0.2.2.27及以上版本。如何查看内核版本,请参见内核版本说明

注意事项

  • 不允许在临时表上设置TTL属性,包括本地临时表和全局临时表。

  • 具有TTL属性的表不支持列存索引(IMC)、多主集群(库表)和GSI等功能。

  • 具有TTL属性的表不支持作为外键约束的主表被其他表引用。

  • 具有TTL属性的表,不允许包含触发器。

  • 不保证所有过期数据会立即被删除,过期数据的删除时间取决于后台清理任务的调度周期。

  • 使用库表或者备份恢复时,恢复完成后TTL表的清理功能将被关闭。因为在恢复后,所有数据可能已经过期。

语法说明

可以通过CREATE TABLEALTER TABLE语句来配置表的TTL功能。

创建具有TTL属性的表

CREATE TABLE `t1` (
  `a` INT PRIMARY KEY,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  KEY idx_created_at (`created_at`)
)ENGINE=InnoDB  TTL='created_at@100';

上述例子创建了一张名为t1的表,并指定created_atTTL的时间列,表示数据的创建时间。同时,通过TTL='created_at@100'设置了表中行的最长存活时间为100秒。超过此时长的过期数据将在之后被删除。

修改表的TTL属性

ALTER TABLE `t1` TTL='created_at@10000';

清除一张表的TTL属性

ALTER TABLE t1 TTL = '';

参数说明

同时添加了以下全局参数来控制TTL过期数据的清理:

说明

PolarDB支持通过控制台修改以下全局参数,来控制TTL过期数据清理。

参数名称

描述

参数名称

描述

loose_innodb_enable_ttl_purge

是否开启TTL过期数据的清理。

loose_innodb_ttl_min_interval

设置数据过期时间时,允许的最小时间,默认值为100,默认单位为秒。

loose_innodb_ttl_purge_thread

清理TTL过期数据的线程数。修改后需重置innodb_enable_ttl_purge参数才能生效,默认为4。

loose_innodb_ttl_cluster_index_purge_batch_size

如果指定的TTL列没有索引,扫描TTL过期数据时将扫描主键,一次扫描主键的行数默认为10,000。

loose_innodb_ttl_index_purge_batch_size

如果指定的TTL列已建立索引,扫描TTL过期数据时将扫描此索引,一次扫描此索引的行数默认为500。

loose_innodb_ttl_purge_start_hour

TTL清理任务开始的时间,默认为0,取值范围为0~23,不得超过innodb_ttl_purge_end_hour

loose_innodb_ttl_purge_end_hour

TTL清理任务结束的时间,默认为0,取值范围为0~23,不得小于innodb_ttl_purge_start_hour

观测TTL

系统会定时采集TTL运行时的信息,并提供一张系统表,用于展示TTL清理任务执行的具体状况,该表的表名为ttl_job_history,具体信息如下:

CREATE TABLE IF NOT EXISTS ttl_job_history (
  job_id BIGINT unsigned NOT NULL COMMENT 'clean job id',
  table_name VARCHAR(255) NOT NULL COMMENT 'clean ttl table name',
  state VARCHAR(255) NOT NULL COMMENT 'clean job state',
  start_time BIGINT unsigned NOT NULL COMMENT 'job start time, unix timestamp',
  finished_time BIGINT unsigned COMMENT 'job finished time, unix timestamp',
  expire_time BIGINT unsigned COMMENT 'record expired time, unix timestamp',
  scan_cost INT unsigned COMMENT 'scan expired record cost, milliseconds',
  purge_cost INT unsigned COMMENT 'purge expired record cost, milliseconds',
  purge_rows INT unsigned COMMENT 'purge expired record rows',
  PRIMARY KEY job_id (job_id)
) ENGINE=INNODB STATS_PERSISTENT=0 CHARACTER SET utf8 COLLATE utf8_bin comment='ttl clean job history' TABLESPACE=mysql;

ttl_job_history表中字段说明如下:

列名

描述

列名

描述

job_id

TTL清理的任务ID,一般为时间戳,毫秒级。

table_name

表示此次TTL执行的任务对应的表名称。

state

TTL任务执行的状态,包括挂起、执行中和完成。

start_time

任务的开始时间。

finished_time

任务的完成时间。

expire_time

此次TTL任务清理的数据的过期时间。

scan_cost

扫描此批次所用的耗时。

purge_cost

清理此批次所用的耗时。

purge_rows

此次TTL任务清理的数据行数。

  • 本页导读 (1)
  • 版本限制
  • 注意事项
  • 语法说明
  • 创建具有TTL属性的表
  • 修改表的TTL属性
  • 清除一张表的TTL属性
  • 参数说明
  • 观测TTL
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等