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_enableloose_polar_oss_enableloose_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 提前删除待归档记录。冷数据归档使用说明
备注:内容仅供参考。
