TTL使用说明

更新时间:2025-02-18 02:08:57

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

版本限制

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

注意事项

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

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

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

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

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

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

语法说明

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

创建具有TTL属性的表

您可以使用以下两种方法中的一种来创建TTL属性的表:

创建了一张名为t1的表,并指定created_atTTL的时间列,表示数据的创建时间。通过设置created_at存活时间来调整数据是否被删除。

  • 设置created_at最长存活时间为100秒。

    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';
    说明

    通过TTL='created_at@100'设置了表中行的最长存活时间为100秒。超过此时长的过期数据将在之后被删除。

  • 设置created_at最长存活时间为3小时。

    CREATE TABLE `t1` (
      `a` INT PRIMARY KEY,
      `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      KEY idx_created_at (`created_at`)
    )ENGINE=InnoDB  TTL='created_at' + INTERVAL 3 HOUR;
    说明
    • 通过设置TTL ='created_at'+ INTERVAL 3 HOUR,您可以将表中的最长存活时间设为3小时,超出该时长的过期数据将被自动删除。

    • TTL(Time To Live)设置支持多种时间单位,包括YEAR(年)、QUARTER(季度)、MONTH(月)、WEEK(周)、DAY(天)、HOUR(小时)、MINUTE(分钟)和SECOND(秒)。这种灵活性使得您能够根据具体需求选择合适的时间单位,实现高效的数据管理和维护。

修改表的TTL属性

您可以使用以下两种方法中的一种来修改表的TTL属性:

通过修改t1表中created_at存活时间来调整数据是否被删除。

  • 修改created_at最长存活时间为10000秒。

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

    通过在created_at字段上设置TTL10000秒,确保数据在创建时间后的10000秒内,超过10000秒的数据会被自动删除。

  • 修改created_at最长存活时间为3天。

    ALTER TABLE `t1` TTL='created_at' + INTERVAL 3 DAY;
    说明

    通过在TTL属性中使用created_at时间戳并增加3天的有效期,设置数据的过期时间为3天,从而确保数据在创建后不会超过3天,超出3天的数据会被自动删除。

清除一张表的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