PolarDB-X 2.0支持管理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_JOB,系统按时自动启动过期数据清理任务。
重要
系统最多支持2张TTL表同时执行数据清理任务,其余清理任务排队等待执行。
定时自动启动,示例:
ALTER TABLE `my_ttl_tbl` MODIFY TTL SET TTL_ENABLE = 'ON';说明
为TTL表my_ttl_tbl打开自动清理过期数据任务的执行开关(该开关默认为关闭状态)。
ALTER TABLE `my_ttl_tbl` MODIFY TTL SET TTL_JOB = CRON '0 0 2 */1 * ? *' TIMEZONE '+08:00';
说明
- 调整TTL表my_ttl_tbl的自动清理过期数据任务执行计划(执行时间点和频率)。
- TTL_JOB定义的调度时间是预期时间值,实际执行时间需要依赖它的前置任务是否完成(如果有多张TTL表正在执行清理,则需要等待其他任务完成)。
手动启动,示例:
/*+TDDL:cmd_extra(ENABLE_ASYNC_DDL=true, PURE_ASYNC_DDL_MODE=true)*/ALTER TABLE `my_ttl_tbl` CLEANUP EXPIRED DATA;
说明
- /*+TDDL:cmd_extra(ENABLE_ASYNC_DDL=true, PURE_ASYNC_DDL_MODE=true)*/用于设置该DDL后台异步执行,无须在当前会话同步等待返回结果。
- ALTER TABLE CLEANUP EXPIRED DATA只支持TTL表。
TTL表采用的是“由远及近分批清理”的清理算法,从最早的数据开始清理,每次只清理固定时间范围的数据。
如下代码修改表my_ttl_tbl的TTL定义:
ALTER TABLE `my_ttl_tbl` MODIFY TTL SET TTL_EXPR = `time` EXPIRE AFTER 1 MONTH TIMEZONE '+08:00'
说明
假设当前时间为2023-10-01,在线表只需要保存最近1个月的数据,清理流程示例如下图所示:
说明
TTL定义的时间列其最小时间值为2022-10-05(MinValue),再根据清理的时间范围(CleanupDataInterval,本例中为3个月。更多信息,请参见调整清理时间范围。)得出本次清理的范围为2022-10-05≤Time<2023-01-01。以此类推其他清理范围分别是2023-01-01≤Time<2023-04-01、2023-04-01≤Time<2023-07-01、2023-07-01≤Time<2023-09-01。
同Day 1,清理时间列满足2023-01-01≤Time<2023-04-01条件的数据,即2023-04-01为本次清理任务的上边界(CleanupUpperBound)。
同Day 1,清理时间列满足2023-04-01≤Time<2023-07-01条件的数据,即2023-07-01为本次清理任务的上边界(CleanupUpperBound)。
与之前略有不同,清理时间列满足2023-07-01≤Time<2023-09-01条件的数据,时间范围为2个月。因为上图中假设的当前时间为2023-10-01(Now),且TTL表被设置为保留最近1个月(ExpiredDataInterval,TTL表的数据存活时间)的数据,所以本次只能清理2023-09-01之前的数据,即2023-09-01为本次清理任务的上边界(CleanupUpperBound)。
综上所述,可以得出每次清理任务的上边界(CleanupUpperBound)的计算公式为CleanupUpperBound=Min(MinValue+CleanupDataInterval,Now−ExpiredDataInterval)。
您可以通过如下代码查询视图INFORMATION_SCHEMA.TTL_INFO,以获取数据库中所有TTL表的定义及其清理任务的调度开关状态:
SELECT * FROM INFORMATION_SCHEMA.TTL_INFO WHERE TABLE_SCHEMA='ttldb' AND TABLE_NAME = 'my_ttl_tbl';字段说明:
您可以通过查询INFORMATION_SCHEMA.TTL_SCHEDULE视图,来获取指定TTL表的清理任务的实时运行信息。
如下代码查看TTL表my_ttl_tbl正在运行的清理任务:
// 手动调起清理任务ALTER TABLE `my_ttl_tbl` CLEANUP EXPIRED DATA; SELECT * FROM INFORMATION_SCHEMA.TTL_SCHEDULE WHERE TABLE_SCHEMA='ttldb' AND TABLE_NAME = 'my_ttl_tbl';
字段说明:
部分指标名 | 含义 |
SCHEDULE_STATUS | 定时任务的调度开关: |
SCHEDULE_EXPR | 定时清理任务调度时间间隔,该值可调整。具体操作,请参见调整定时清理任务的执行计划。 |
SCHEDULE_COMMENT | SCHEDULE_EXPR字段的语义解析。 |
SCHEDULE_TIMEZONE | 定时任务调度的时区。 |
SCHEDULE_LAST_FIRE_TIME | 上一次触发自动调度的时间值(初始值为 '1970-01-01 08:00:00', 表示没有触发自动调度)。 |
SCHEDULE_NEXT_FIRE_TIME | 下一次触发自动调度的时间值(初始值为 '1970-01-01 08:00:00', 表示没有触发自动调度)。 |
TTL_CURR_TTL_COL_MIN_VAL | 当前清理任务的TTL定义的时间列的最小值。 |
TTL_CURR_JOB_STAGE | 当前清理任务所处的阶段。 |
TTL_CURR_CLEANUP_BOUND | 当前清理任务正在清理的时间列的值。 |
TTL_CURR_CLEANUP_UPPER_BOUND | 当前清理任务的清理上界,即本次清理历史数据的范围小于该值。 |
TTL_CURR_NEW_DATETIME_VAL | 当前时间。 |
TTL_CURR_DN_ROWS_SPEED_LIMIT | 当前清理任务的清理限速(每个存储节点执行DELETE语句的速度),单位是每秒清理的行数。 |
TTL_CURR_CLEANUP_ROWS | 当前清理任务已经清理的总行数。 |
TTL_CURR_CLEANUP_ROWS_SPEED | 当前清理任务的实时清理速度,单位是每秒清理的行数。 |
TTL_CURR_CLEANUP_DATA_LENGTH | 当前清理任务已经完成清理的总字节数(估算值)。 |
TTL_CURR_CLEANUP_SPEED | 当前清理任务的实时清理速度,单位是每秒清理的字节数(估算值)。 |
TTL_CURR_SELECT_SQL_AVG_RT | 当前清理任务执行SELECT语句的平均响应时间,单位:毫秒。 |
TTL_CURR_DELETE_SQL_AVG_RT | 当前清理任务执行DELETE语句的平均响应时间,单位:毫秒。 |
TTL_CURR_JOB_PERCENT | 当前清理任务的完成百分比。 |
TTL_CURR_CLEANED_PHY_PART_COUNT | 当前清理任务已完成清理的物理分区数。 |
TTL_CURR_TOTAL_PHY_PART_COUNT | 当前清理任务总共需要完成的物理分区数。 |
您可以通过管理清理任务,使其在合适时间以合适的速度进行数据清理,使清理任务对业务的影响达到最低。
PolarDB-X 2.0后台任务默认的可运维窗口是每天02:00 ~ 05:00,您可以通过如下代码将可运维的时间窗口调整至每天01:00 ~ 06:00:
set global MAINTENANCE_TIME_START = '01:00';
set global MAINTENANCE_TIME_END = '06:00';
单个存储节点的清理速度限制默认为1000行每秒,即该节点上所有清理任务速度的总和不超过1000行每秒,实例中存储节点数越多总清理速度越快。
您可以通过如下代码调整单个存储节点的清理速度限制为1万行每秒:
set global TTL_ENABLE_CLEANUP_ROWS_SPEED_LIMIT=10000重要
默认情况下,TTL表的一次清理任务的时间范围主要是由 TTL_CLEANUP_BOUND_INTERVAL_COUNT 这个参数所控制:
您可以通过如下代码,调整清理数据的时间范围:
set global TTL_CLEANUP_BOUND_INTERVAL_COUNT = 6;说明
TTL_CLEANUP_BOUND_INTERVAL_COUNT默认值为3,即清理数据的时间范围是TTL定义中存活时间单位的3倍。执行上述SQL将其调整为6,即清理数据的时间范围是TTL定义中存活时间单位的6倍,示例如下:
- TTL定义的时间单位是天:`time` EXPIRE AFTER NUM DAY TIMEZONE '+08:00',即默认的清理范围为6天(MinValue≤Time<(MinValue+6 Day))。
- TTL定义的时间单位是月:`time` EXPIRE AFTER NUM MONTH TIMEZONE '+08:00',即默认的清理范围为6月(MinValue≤Time<(MinValue+6 Month))。
通过SHOW FULL DDL查看所有清理任务的JOB_ID:
show full ddl\G;pause ddl 1771694362409848832;说明
清理任务的DDL JOB可以实时暂停或回滚,但清理任务的回滚仅仅会回滚清理任务本身,并不会回滚已经被清理的数据。更多信息,请参见DDL管理语句。
您可以通过执行如下代码来重启被暂停的清理任务:
CONTINUE DDL 1771694362409848832;




