PAYATHON 2026

PolarDB MySQL TTL 能否将过期数据自动归档至 OSS?

数据小许

可以,但集群需要支持 TTL 归档。官方文档要求使用 PolarDB MySQL 8.0.2,内核小版本为 8.0.2.2.37 及以上。现有的 TTL='event_time@2592000' 只配置了过期删除,还需要增加 ARCHIVED 属性才能启用归档。问题中未提供内核版本,请先在集群详情中确认。官方 TTL 归档说明

归档如何工作

过期行先写入独立归档表,再从源表删除,两步在同一事务中完成。后台随后按分区将较老的数据迁移至 OSS。因此,数据到期后仍会离开源表,但不会立即逐行写入 OSS。

为现有表启用归档

先确认以下参数均为 ON:

  • loose_innodb_ttl_archived_enable
  • loose_polar_oss_enable
  • loose_innodb_enable_ttl_purge

满足版本和参数条件后,修改现有表:

ALTER TABLE user_activity_logs
  TTL='event_time@2592000@ARCHIVED';

SHOW CREATE TABLE user_activity_logs FULL;

2592000 仍表示 30 天;FULL 用于查看完整的 TTL 和归档属性。以上配置及语法见官方配置说明。

如何查询历史数据

系统生成的归档表名为 user_activity_logs__ttl_archived__。查询包含 OSS 冷分区的历史记录时使用:

SELECT log_id, user_id, event_type, event_data, event_time
FROM user_activity_logs__ttl_archived__ WITH ARCHIVED
WHERE user_id = 123
ORDER BY event_time DESC
LIMIT 100;

查询源表不会自动包含归档表中的数据;历史分析需要显式访问归档表。官方查询说明

留存数据前要注意什么

  • 启用归档无法找回此前已被 TTL 删除的记录。
  • 回填很老的数据前,要检查对应分区是否已迁移到 OSS。官方明确提示,这种场景可能出现归档写入被丢弃、源记录仍被删除的情况;重复归档主键也会被静默跳过。
  • 移除归档属性或清除 TTL 可能触发归档表的后台回收,操作前应保全历史数据。
  • 归档相关写入和删除不记录 Binlog,不应依靠下游 Binlog 消费来补齐归档结果。可结合 mysql.ttl_job_history 和实例错误日志检查运行情况。

这些限制会影响数据完整性,合规留存场景应先验证恢复和历史回填流程。官方注意事项

PolarDB 冷数据归档使用系统管理的 OSS,并不等于导出到你指定的 Bucket。如果需要自有 Bucket,或当前版本无法启用 TTL 归档,可以设计独立归档任务:先导出并核验成功,再清理源数据,同时避免普通 TTL 提前删除待归档记录。冷数据归档使用说明

备注:内容仅供参考。