功能
SYS.TTL_TASK 记录 TTL(Time To Live)过期数据清理任务的当前执行状态,是运维排查 TTL 任务的核心系统表。系统在 Leader 节点上周期性扫描已启用 TTL 的表,并向该表写入 waiting 状态的任务;各 SQLEngine 节点上的执行进程获取任务并执行过期数据清理。终态任务(
finished 或 cancelled)会被任务回收(GC)流程迁移到 SYS.TTL_TASK_HISTORY 历史表中,sys.ttl_task 仅保留活跃任务和近期终态任务。适用版本
TDSQL Boundless V21.6.4.0及以上版本。
字段说明
字段名 | 类型 | 描述 |
task_id | bigint unsigned | 任务唯一标识,自增主键,NOT NULL。 |
table_schema | varchar(64) | 数据库名,NOT NULL。 |
table_name | varchar(64) | 表名,NOT NULL。 |
partition_name | varchar(64) | 分区名。非分区表为空字符串。 |
tindex_id | bigint unsigned | 表的存储索引标识 ID,DEFAULT 0。 |
expire_threshold | datetime | 过期阈值时间点。任务下发时计算为 NOW() - INTERVAL <duration> <unit>,下发后固定不变。 |
schema_version | bigint unsigned | 下发任务时的 schema 版本号。运行中若源表 schema_version 发生变化,任务会被取消。 |
batch_size | int unsigned | 单批删除行数,取自系统变量 ttl_delete_batch_size,DEFAULT 1000。 |
status | ENUM | 任务状态。 waiting(默认值):等待执行。 running:执行中。 finished:已完成。 cancelled:已取消。 |
owner_id | varchar(64) | 执行节点 ID,获取任务时写入该节点的标识。 |
owner_hb_time | datetime | 心跳时间。运行中任务定期更新,若超过2分钟无心跳更新,其他节点可接管。 |
created_by | ENUM | 任务创建来源。 scheduler(默认值):系统自动下发。 manual:通过 dbms_admin.ttl_submit() 手动触发。 |
scheduler_id | varchar(64) | 下发任务的调度节点 ID。 |
strategy | ENUM | |
on_conflict | enum('STOP','REPLACE') | 如果配置了归档表,归档任务遇到主键/唯一键冲突的处理方式; |
deleted_rows | bigint unsigned | 已删除行数,执行过程中累计更新,DEFAULT 0。 |
error_message | text | 错误或取消原因。任务失败或取消时写入具体原因。 |
created_at | datetime | 任务创建时间,DEFAULT CURRENT_TIMESTAMP,NOT NULL。 |
started_at | datetime | 任务开始执行时间,获取任务时写入。 |
finished_at | datetime | 任务结束时间,任务转为 finished 或 cancelled 时写入。 |
说明:
该表设有唯一约束
uk_table_partition (table_schema, table_name, partition_name),确保同一张表(或分区)同时只有一个活跃任务。状态流转
状态 | 说明 | 触发条件 |
waiting | 等待执行 | 系统下发任务或手动触发 dbms_admin.ttl_submit()。 |
running | 执行中 | 执行节点获取任务并开始清理过期数据。 |
finished | 已完成 | 任务正常执行完成。 |
cancelled | 已取消 | 任务被中止。常见原因:全局开关 ttl_enable 关闭、超出调度窗口、源表 schema_version 变更(DDL 并发冲突)、归档失败。 |
说明:
手动触发的任务(
created_by = 'manual')不受调度窗口限制,但仍受全局开关 ttl_enable 约束。任务完成后,任务回收(GC)流程会将
finished 和 cancelled 状态的任务迁移到 SYS.TTL_TASK_HISTORY 历史表中,并释放 uk_table_partition 唯一键占用,允许同一表的下一个任务被写入。执行策略说明
策略 | 说明 | 适用场景 |
single_statement | 直接执行单条 DELETE ... WHERE ttl_col < expire_threshold LIMIT batch_size 语句。 | TTL 列上存在合适索引,或表无显式主键的场景。 |
scan_then_delete | 先扫描一批过期数据的主键,再按主键列表执行删除。 | 表有显式主键但 TTL 列无合适索引的场景,可将删除收敛到明确的主键集合。 |
archive_then_delete | 先扫描本批过期数据,写入归档表后再从源表删除。 | 源表配置了 TTL_ARCHIVE_TABLE 时强制使用,优先级高于全局 ttl_delete_strategy。 |
注意:
若配置了归档表但归档步骤失败,当前任务会失败退出并标记为
cancelled,不会静默降级为直接删除。相关系统表
系统表/视图 | 说明 |
历史任务记录,用于审计、问题排查和执行效果统计。终态任务经任务回收(GC)流程从 sys.ttl_task 迁移至此表。 | |
已启用 TTL 的表配置信息,包括 TTL 时间列、保留时长、调度间隔、归档表等。 |
示例
查询正在执行的任务
tdsql> SELECT * FROM SYS.TTL_TASK WHERE status = 'running' LIMIT 2\\G*************************** 1. row ***************************task_id: 1024table_schema: mydbtable_name: operation_logpartition_name:tindex_id: 288230376151711744expire_threshold: 2026-07-01 00:00:00schema_version: 4batch_size: 1000status: runningowner_id: 3d2f1a8b-****-****-****-************owner_hb_time: 2026-07-08 15:30:12created_by: schedulerscheduler_id: 3d2f1a8b-****-****-****-************strategy: scan_then_deleteon_conflict: NULLdeleted_rows: 8500error_message: NULLcreated_at: 2026-07-08 15:25:00started_at: 2026-07-08 15:25:01finished_at: NULL*************************** 2. row ***************************task_id: 1025table_schema: mydbtable_name: user_sessionspartition_name:tindex_id: 288230376151711745expire_threshold: 2026-07-08 13:00:00schema_version: 2batch_size: 1000status: runningowner_id: 5a1c9e3d-****-****-****-************owner_hb_time: 2026-07-08 15:30:15created_by: manualscheduler_id: 3d2f1a8b-****-****-****-************strategy: single_statementon_conflict: NULLdeleted_rows: 3200error_message: NULLcreated_at: 2026-07-08 15:28:00started_at: 2026-07-08 15:28:02finished_at: NULL2 rows in set (0.00 sec)
查询已取消的任务
SELECT task_id, table_schema, table_name, partition_name,status, error_message, finished_atFROM SYS.TTL_TASKWHERE status = 'cancelled'ORDER BY finished_at DESCLIMIT 2\\G
tdsql> SELECT task_id, table_schema, table_name, partition_name,-> status, error_message, finished_at-> FROM SYS.TTL_TASK-> WHERE status = 'cancelled'-> ORDER BY finished_at DESC-> LIMIT 2\\G*************************** 1. row ***************************task_id: 1020table_schema: mydbtable_name: orderspartition_name: p0status: cancellederror_message: schema_version changed during execution, task cancelledfinished_at: 2026-07-08 14:50:30*************************** 2. row ***************************task_id: 1018table_schema: mydbtable_name: event_logpartition_name:status: cancellederror_message: ttl_enable is OFF, task cancelledfinished_at: 2026-07-08 10:15:222 rows in set (0.00 sec)