本文介绍了PolarDB MySQL版的过期数据清理功能。
版本限制
适用的数据库引擎版本为MySQL 8.0.2,且小版本需为8.0.2.2.27及以上版本。如何查看内核版本,请参见内核版本说明。
注意事项
不允许在临时表上设置TTL属性,包括本地临时表和全局临时表。
具有TTL属性的表不支持列存索引(IMC)、多主集群(库表)和GSI等功能。
具有TTL属性的表不支持作为外键约束的主表被其他表引用。
具有TTL属性的表,不允许包含触发器。
不保证所有过期数据会立即被删除,过期数据的删除时间取决于后台清理任务的调度周期。
使用库表或者备份恢复时,恢复完成后TTL表的清理功能将被关闭。因为在恢复后,所有数据可能已经过期。
语法说明
可以通过CREATE TABLE
或ALTER 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_at
为TTL的时间列,表示数据的创建时间。同时,通过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过期数据的线程数。修改后需重置 |
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,不得超过 |
loose_innodb_ttl_purge_end_hour | TTL清理任务结束的时间,默认为0,取值范围为0~23,不得小于 |
观测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