数据归档频率设定的核心依据不是日历上的固定周期,而是数据被实际访问的模式,按访问频率和最近访问时间动态归档,才能避免热数据被误迁、冷数据白占空间。
为什么固定周期归档正在失效
固定周期归档假设每类数据按同样节奏变冷,现实不是这样。
- 有些订单表三个月后仍被频繁查询,固定30天归档会破坏业务。
- 有些日志表一天后就没多少读请求,固定180天归档纯属浪费存储。
- 不同的业务线、不同的表,数据访问衰减曲线差异很大,一刀切的周期很难同时适配。
固定周期归档的典型陷阱
- 误归档热数据:客服、风控、财务部门经常回查过去几个月的明细,按固定天数迁走会打断正常工作。
- 冷数据滞留:监控指标、临时导出文件早就没人看,却按年度才清理,持续占用昂贵磁盘。
- 成本后知后觉:归档存储成本通常低于高性能存储,但固定周期让本该下沉的数据继续留在高成本层。
- 恢复窗口被动拉长:真正需要回查时,数据可能已经被删了,或者藏在没有索引的归档表里。
访问模式才是真正的触发器
数据生命周期由三个参数决定:最近一次读时间、读频率、业务保留要求。
行业共识认为,脱离访问模式谈归档频率,很容易陷入“要么过早、要么过晚”的困境,比如一张用户登录日志表,写入后两小时内会有大量风控读请求,三天后读请求趋近于零,如果按月度归档,前三天它还在主库占着资源;如果按年度归档,后面十一个月都在空转。
据IDC公开数据,企业数据中相当大比例属于很少被访问的冷数据,真正活跃的热数据占比并不高,这恰恰说明,按访问模式识别冷热,比按时间固定切分更贴近真实。
数据归档频率怎么设置?先摸清访问模式
要基于访问模式设置频率,得先有数据支撑,步骤如下。
第一步:给数据打上访问标签
没有访问记录,就谈不上按访问模式归档,不同数据库有不同的采集方式。
- 在MySQL开启
slow_log或general_log,统计表级别读次数。 - 在PostgreSQL用
pg_stat_statements视图查找长期无读的表。 - 对象存储可开启访问日志,记录每个前缀的
GET请求次数。
命令示例:在MySQL中执行以下语句,可初步辅助定位冷表。
SELECT table_schema, table_name, last_read FROM sys.table_io_waits_summary_by_table;
不同版本字段会不同,但思路一致:拿到每个表或每个对象的最后读时间。
第二步:定义冷热阈值
不要照搬别人的“30天”“90天”,先回答三个问题:
- 业务上最长回查周期是多少?
- 合规要求保留多久?
- 高性能存储每TB月成本与归档存储价差是否足够大?
多数情况下,连续 90天无读请求 且满足合规最短保留期的表,可以进入归档候选,监控指标类数据可缩短到 7天无读请求,某些合规要求严格的行业,即使90天无读也不能删,需要转入只读冷层保留。
第三步:设置动态归档规则
以MySQL为例,可写定时任务找出超阈值分区。
SELECT PARTITION_NAME, TABLE_ROWS, UPDATE_TIME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='archive_db' AND PARTITION_NAME IS NOT NULL AND UPDATE_TIME < NOW() - INTERVAL 90 DAY;
再用ALTER TABLE ... EXCHANGE PARTITION或pt-archiver迁移,具体命令:
pt-archiver --source h=192.168.1.10,D=app_db,t=order_log --where "last_read < NOW() - INTERVAL 90 DAY" --purge --limit 1000 --commit-each
前提是表里有last_read字段,由应用层或数据库中间件每次查询时更新,没有该字段,可以借助数据库审计插件补齐。
归档存储成本如何影响频率设定
高性能SSD与对象存储冷层的价差较大,按访问模式下沉能带来可观的成本优化,但成本不是唯一因素,恢复时间也要考虑,冷层读取延迟通常高于在线存储,如果把偶尔还会被查的数据压得太深,后续每次取回都要等几秒甚至更久。
业内专家指出,归档频率设定的本质是在存储成本、恢复性能和合规风险之间找平衡点,访问模式提供了判断依据,但最终阈值还得结合自身业务承受能力。
固定周期归档和按访问模式归档哪个好?
直接上对比。
| 维度 | 固定周期归档 | 按访问模式归档 |
|---|---|---|
| 存储成本 | 较高,冷数据滞留 | 较低,冷数据及时下沉 |
| 查询性能 | 热数据可能被迁走 | 热数据留在原库 |
| 误归档风险 | 中等 | 低 |
| 运维复杂度 | 低 | 中,需监控访问日志 |
| 适用场景 | 合规驱动、数据访问曲线稳定 | 业务波动大、历史回查频繁 |
场景化建议
- 电商订单数据:按访问模式,保留最近6个月热数据,更早但仍有读的继续留在温区。
- 服务器监控指标:固定周期可接受,多数监控数据7天后访问趋零。
- 医疗影像归档:合规要求优先,不能单纯按访问模式,需叠加固定保留年限。
- 上海企业数据归档实践中,很多团队会混合两种策略:固定周期保底,访问模式调优。
企业数据库归档策略:从命令到自动化
MySQL表归档实操
- 给目标表增加
last_read字段,由ORM或数据库中间件更新。 - 每天凌晨执行一次探测脚本,筛选超过阈值的表。
- 先
CREATE TABLE archive_xxx SELECT FROM xxx WHERE ...再DELETE,或使用pt-archiver增量迁移。 - 迁移后执行
OPTIMIZE TABLE释放空间,但在线执行需注意锁表。
对象存储生命周期策略
以MinIO为例,给logs/前缀设置生命周期。
mc ilm rule add --expire-days "90" --filter "prefix=logs/" local/log-bucket
该命令会把超过90天未读的对象自动转移到冷存储层,前提是MinIO已配置分层存储。
AWS S3类似,创建生命周期规则时选择“根据访问时间”而非“根据对象年龄”,新版本已支持访问时间分层,如果对象存储还不支持按访问时间分层,可以先导出访问日志,再用脚本定期移动冷对象。
监控与回滚
- 归档前用
mysqldump或对象存储版本控制做备份。 - 归档后抽查5到10条记录,确认可恢复。
- 建立回滚脚本,出现误归档时能快速恢复。
归档频率不是日历问题,而是数据行为问题,只有持续追踪访问模式,才能让热数据跑得快、冷数据存得省。
数据归档频率常见问题
数据归档频率怎么设置才合理?
没有统一数字,先观察完整业务周期内的访问日志,找到读请求快速衰减的时间点,再结合合规与成本确定阈值,多数场景下,90天无读是常见候选线。
固定周期归档和按访问模式归档哪个好?
业务回查频繁、访问曲线波动大的库,按访问模式明显更优,日志类、合规类数据可保留固定周期作为保底。
企业数据库归档策略中如何判断冷数据?
以最近读时间为首要指标,连续90天无读且不在合规强制保留期内,可标记为冷数据,写入时间不能单独作为依据,部分老数据仍会被高频读取。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/638756.html





