如何在AWS RDS上搭建仅含近3个月数据的MySQL轻量副本
方案1:实时轻量增量副本搭建(仅同步指定表+最近3个月数据)
- 预配置目标轻量数据库
可直接开通小规格RDS MySQL/Aurora Serverless v2(按需计费成本更低),实例规格根据仪表盘/常规报表的QPS选择,中小流量场景用t3.medium即可满足需求。先手动同步需要的表的3个月内历史数据:
用mysqldump加过滤条件导出源库指定表的有效数据:
导出完成后直接导入到目标轻量库中即可。mysqldump -h [源RDS端点] -u [用户名] -p [数据库名] [表名1] [表名2] --where="create_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)" --set-gtid-purged=OFF > recent_3m_data.sql - 配置增量实时同步
用AWS DMS(数据库迁移服务)实现增量同步,无需自行维护同步工具:- 源端配置:先开启源RDS的binlog,格式设置为ROW(DMS增量同步强制要求),binlog保留期设置为至少24小时,避免同步中断后binlog被提前清理
- DMS任务配置:选择仅复制更改模式(已提前导入3个月历史数据无需重复全量同步),映射规则中仅勾选需要同步的表,同时添加行过滤规则,仅同步
create_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)的行,超过3个月的旧数据不会同步到目标库 - 可选配置:可开启DMS的DDL同步能力,源表新增字段、修改索引等改动可自动同步到目标库
- 自动清理目标库过期数据
在目标轻量库中配置定时事件,每天自动删除超过3个月的旧数据,确保库体积始终可控:
该方案同步延迟通常在秒级,完全满足仪表盘和常规报表的实时性要求,目标库存储仅为源库的1/5-1/10,资源成本极低。CREATE EVENT cleanup_old_data ON SCHEDULE EVERY 1 DAY DO DELETE FROM [表名] WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
方案2:无额外副本的替代方案
- 表分区(最推荐的轻量替代方案)
直接在源库对增速快的大表按时间做范围分区,无需搭建额外副本,查询最近3个月数据时仅扫描对应分区,性能和查询独立小库几乎无差异:- 分区配置示例:按月份分区的修改语句
ALTER TABLE [大表名] PARTITION BY RANGE (TO_DAYS(create_time)) ( PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')), PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')), PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); - 运维配置:编写定时事件每月自动创建下一个月的分区,超过3个月的旧分区可根据需求选择删除或保留,保留旧分区也不会影响近3个月数据的查询性能
- 优势:无需维护额外数据库实例,无同步延迟问题,查询最近3个月数据时MySQL会自动跳过旧分区,IO开销和查询小库一致;重型报表需要查询全量数据时也可直接访问源库,无需切换数据源
- 注意事项:分区键需选择查询常用的时间过滤字段(如create_time、update_time),查询时必须带分区键的过滤条件才能触发分区裁剪,否则仍会扫描全表
- 分区配置示例:按月份分区的修改语句
- 其他可选替代方案
- 只读实例加页面压缩:如果不想做过滤同步,可直接开通原生只读副本,开启MySQL页面压缩功能,存储成本可降低30%-50%,适合后续可能扩展查询场景、需要全量数据的情况
- 物化视图:如果报表查询逻辑固定,可在源库定时生成最近3个月数据的物化视图,查询直接命中视图,无需扫描全表,适合查询逻辑变化少的场景
内容的提问来源于stack exchange,提问作者thriller
相关产品推荐
相关产品推荐

