MySQL 历史数据如何归档和定期清理?NineData 配置与实施指南

举报
NineData 发表于 2026/10/21 16:50:09 2026/10/21
【摘要】 使用 NineData 配置 MySQL 历史数据归档与定期清理的方法,覆盖归档策略、时间字段、保留天数、业务过滤、周期调度、SQL 预览、冲突处理、审批及 Optimize 空间回收注意事项。
订单、操作日志、消息记录等业务表持续增长后,历史数据会占用在线存储空间,并增加查询、备份和日常维护的成本。这些数据访问频率不高,却未必能够直接删除:业务查询、问题追溯和数据保留要求,都可能需要继续保存。
针对这类场景,NineData 提供数据归档与清理功能:按照时间字段、保留天数和过滤条件识别历史数据,将其归档到目标数据库,再清理源端已归档数据。任务支持单次执行和周期执行,并提供 SQL 预览、审批、时区配置、执行时长限制和 Optimize 策略。
本文以 MySQL 订单历史数据为例,介绍如何配置归档任务,以及上线前需要验证的关键事项。

一、先确定:仅归档、归档后清理,还是直接清理

历史数据治理首先要明确数据去向。NineData 提供三种策略:
策略 执行行为 适用场景
仅归档 将符合条件的数据复制到目标库,保留源端数据 首次验证归档结果,或需要保留在线副本
归档+清理 先归档,再删除源库中已归档的数据 将历史数据迁出业务库
仅清理 删除符合条件的数据,不归档 已确认无需保留的过期数据

1.PNG


归档不能替代备份。归档用于管理历史数据的存放位置和保留范围;备份用于故障恢复。业务库和归档库仍应分别配置备份与恢复机制。
对第一次实施的生产系统,建议先执行小范围“仅归档”,确认数据范围、字段映射和查询结果,再配置正式的“归档+清理”任务。

二、实施前提与示例场景

  1. NineData 使用条件

使用数据归档与清理功能,需要:
  • 已创建或加入组织;
  • 组织已开通数据库 DevOps 企业版,订阅有效;
  • 当前账号已切换到目标组织;
  • 源表具有可作为归档依据的时间字段。
本文源端与归档目标端均采用 MySQL。NineData 功能文档列出的归档目标数据库还包括 PostgreSQL、MariaDB 和 GBase8a,本文不展开跨数据库归档。
  1. 示例:归档已完成的历史订单

假设业务表为:
CREATE TABLE orders ( id BIGINT NOT NULL PRIMARY KEY, customer_id BIGINT NOT NULL, status VARCHAR(32) NOT NULL, amount DECIMAL(18, 2) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, KEY idx_created_at (created_at) );
治理要求为:
  • 在线库保留最近 365 天的订单;
  • 只归档状态为 COMPLETED 的历史订单;
  • 归档数据保存到独立 MySQL 归档库;
  • 每天凌晨启动;
  • 每轮任务最多执行 4 小时。
对应配置为:
配置项 示例值
策略 归档+清理
源表 orders
时间字段 created_at
保留天数 365
数据过滤条件 status = 'COMPLETED'
频率 周期执行,每天
启动时间 1:00
执行时长限制 4 小时
时间条件与业务条件必须共同确定。“创建超过一年”不一定意味着订单已经结束。对于仍可能退款、补偿或更新的记录,应先确认生命周期,再决定是否迁出在线库。

三、在 NineData 中创建归档任务

第一步:配置基本信息与策略

进入:
数据库 DevOps > 数据归档与清理 > 创建归档与清理
填写任务名称、备注,选择“归档+清理”,然后指定源数据源、源数据库和归档目标数据源、目标数据库。
建议任务名称包含业务对象和保留规则,例如:
订单归档_保留365天_每日执行
源库与归档库应提前完成连接测试和账号授权。正式实施前,还需要确认归档库容量、访问权限、备份策略及历史查询入口。

2.png


如果源库和归档库位于同一个数据库实例,将数据移到另一个库并不必然降低该实例的总存储占用。需要降低在线实例容量时,应结合独立归档实例规划,并处理后续空间回收。

第二步:设置执行周期、时区与时长

NineData 支持单次执行和周期执行。周期任务可以按周或按月配置,也可以选择每天执行。

3.png


本例设置:
  • 频率:周期执行;
  • 周期:每天;
  • 时区:业务实际采用的时区;
  • 启动时间:01:00;
  • 执行时长限制:4 小时。
执行时长限制支持 1~24 小时。超过限制后,任务会自动终止本轮执行,避免任务持续跨入业务高峰。
需要注意,时长限制不是性能隔离机制,也不代表本轮一定完成全部积压数据。如果历史积压较大,应单独安排首次治理,再使用周期任务处理日常新增的过期数据。
多地域业务还应分别确认:
  1. 任务按哪个时区调度;
  2. 表中时间字段采用什么时间口径。
设置调度时区不能代替业务时间语义的核对。

第三步:选择源表和目标表

在「选择对象」页面添加源表,并指定归档目标表。
使用已有目标表时,需要保证结构兼容。字段名称不同时,通过「映射与过滤」配置对应关系。
也可以通过页面的新建表入口创建归档表,由 NineData 按源表结构创建目标表。
本例将订单统一写入固定归档表:
orders_archive
固定表便于集中查询。需要按归档批次分表时,可以使用日期变量命名,但要同时规划跨表查询、索引维护和历史表清理。

第四步:配置时间字段与保留天数

选择:
时间字段:created_at 保留天数:365
NineData 根据所选时间字段识别超过保留期限的数据,保留天数支持 1~3650 天。
时间字段不局限于 DATETIME。NineData 还支持将以下类型作为时间字段:
  • INT
  • BIGINT
  • CHAR
  • VARCHAR
数值或字符串类型需要配置解析方式:
存储方式 配置方法
日期字符串 指定与实际值匹配的时间格式
Unix 时间戳 选择时间戳,并指定秒、毫秒或微秒精度
例如,毫秒时间戳不能按秒解析。格式或精度配置错误,会影响归档范围,必须在执行前通过样本和 SQL 预览检查。

第五步:配置业务过滤条件

进入「映射与过滤」,填写:
status = 'COMPLETED'
这样,归档范围由“超过保留期限”和“满足业务过滤条件”共同确定。
如果订单与订单明细、支付、退款等表存在关联,需要协调各表规则。仅归档主表、保留关联表,或者相反,都可能导致历史查询不完整。

4.png



创建多张表的归档配置,也不等于自动获得跨表业务一致性。关联数据的归档顺序和查询方式应在上线前验证。

四、目标数据冲突如何处理

MySQL 归档任务提供两种冲突策略:
策略 行为 决策重点
忽略 忽略造成冲突的操作,继续执行 目标已有记录是否可信
覆盖 覆盖目标数据 是否允许源端值更新归档记录
如果目标表存在相同主键,“忽略”可能保留目标旧值,“覆盖”则会改变已有归档数据。

5.png


因此,不能只为了让任务继续运行而选择忽略,也不能在没有确认数据来源时直接覆盖。首次执行前,先检查归档表是否包含测试数据或历史导入数据。
冲突策略不是数据校验。 对归档与清理组合任务,应在演练中验证冲突记录的处理结果以及源端清理结果,确认符合业务保留要求。

五、执行前必须预览 SQL

完成对象、时间和过滤配置后,单击「预览 SQL」,检查 NineData 将执行的归档与清理语句。
重点核对:
  • 源库、源表和目标表;
  • 时间字段与时间范围;
  • 业务过滤条件;
  • 字段映射;
  • 目标数据冲突处理;
  • 是否选错清理对象。
对于本例,需要确认任务只处理超过 365 天且状态为 COMPLETED 的订单。

6.png


SQL 预览用于验证配置是否符合预期,但不能证明性能一定满足生产要求。大表还应检查过滤字段索引、数据分布和实际执行情况。

六、需要按日期建表时,使用 bizdate

NineData 提供 bizdate 系统变量,支持自定义日期格式,并用于新建归档表名或条件表达式。
例如,设置格式:
yyyyMMdd
目标新表名称配置为:
orders_archive_${bizdate}
执行日期为 2026 年 10 月 21 日时,对应表名为:
orders_archive_20261021
这里的日期表示任务使用的系统日期,不自动等同于订单所属月份。按执行日期创建归档表,与按订单业务日期分表,是两种不同的设计。
如果历史数据需要统一检索,固定归档表通常更容易管理;如果需要按批次隔离,应同步设计查询和保留策略。

七、通过审批后执行

NineData 归档任务可以接入审批流程。任务创建后,按配置进入预检查、提交审批和执行环节,由审批人员审核归档范围及操作内容。
建议审批时重点检查:
  • 为什么需要归档或清理;
  • 数据保留期限是否合理;
  • SQL 范围是否正确;
  • 目标库是否具备保存条件;
  • 是否完成演练和备份;
  • 是否安排业务低峰窗口。
审批需要预先配置。 未配置审批流程的数据源不会自动强制要求人工审批。生产归档应先确认流程配置,再提交任务。
审批通过后,由执行人选择立即执行;一次性任务也支持定时执行。周期任务按照配置的周期和启动时间运行。

八、数据清理后,为什么磁盘空间没有明显下降

MySQL 删除记录后,释放的空间可能先留在表文件内部供后续写入复用,并不立即返还操作系统。
因此,要区分:
  • 数据清理:删除不再需要的记录;
  • 空间回收:整理存储结构,回收可释放的表空间。
NineData 在包含清理操作的任务中提供 Optimize 策略,可以配置执行若干次清理后,再执行一次 Optimize。
但 Optimize 不能按“无风险释放空间”处理。实际效果和执行代价取决于 MySQL 存储引擎、表空间配置、表大小及数据库版本。
生产启用前建议验证:
  • 是否需要额外临时空间;
  • 执行耗时;
  • 对读写和锁的影响;
  • 对复制延迟的影响;
  • 是否真正降低了目标磁盘占用。
不要将“每天清理”直接等同于“每天执行 Optimize”。数据清理频率和空间整理频率应分别评估。

九、上线检查清单

检查项 验收内容
产品条件 组织、数据库 DevOps 企业版及订阅状态满足要求
数据范围 时间字段、保留天数、业务过滤条件正确
数据关联 主表与明细等关联数据已协调处理
目标结构 字段、类型和映射经过验证
冲突策略 忽略或覆盖的业务影响明确
SQL 预览 已检查实际归档与清理语句
调度 时区、周期和启动时间正确
时长限制 执行窗口经过演练
审批 生产数据源已配置所需流程
数据验证 归档数据和源端清理结果核对通过
空间回收 Optimize 的资源影响与回收效果已验证
恢复准备 业务库及归档库备份、恢复路径明确
NineData 将归档范围、周期调度、SQL 预览、审批和清理策略集中在控制台中管理,减少重复维护脚本和人工执行的工作。要让周期任务长期稳定运行,还需要持续检查数据增长、归档结果、执行窗口和目标容量,使历史数据治理成为可验证的日常运维流程。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。