如何将Redshift聚合表同步至AWS Aurora MySQL实现精准复制
Redshift聚合表同步到Aurora MySQL的精准副本方案(支持多频次、无停机)
针对你的需求——每日多次将Redshift聚合表同步为Aurora MySQL的精准副本,且MySQL无停机,之前的UNLOAD+LOAD DATA方案无法处理删除的问题,这里提供几个落地性强的解决方案:
方案一:全量同步+原子表切换(适合聚合表全量生成的场景)
如果你的Redshift聚合表是定期全量重生成的(比如每次聚合都是覆盖式生成完整表),这个方案最高效且无停机:
- Redshift操作:用
UNLOAD将聚合表数据导出到S3(推荐按主键分片,方便后续批量导入):UNLOAD ('SELECT * FROM your_aggregate_table') TO 's3://your-bucket/path/to/data/' IAM_ROLE 'arn:aws:iam::account-id:role/redshift-unload-role' FORMAT AS CSV HEADER; - MySQL操作:
- 创建与目标表结构一致的临时表(
tmp_your_table) - 用Aurora的S3直接导入功能(或拉取CSV到MySQL服务器后用
LOAD DATA INFILE)将S3上的数据导入临时表 - 执行原子表切换(MySQL的
RENAME TABLE是原子操作,几乎无锁):RENAME TABLE your_target_table TO old_your_table, tmp_your_table TO your_target_table; DROP TABLE old_your_table;
- 创建与目标表结构一致的临时表(
- 优势:全程无长时间锁表,业务完全不受影响;同步逻辑简单,出错概率低;适合大表全量同步。
方案二:增量+全量混合同步(适合聚合表有增量更新的场景)
如果聚合表是在原有数据基础上做增量更新(而非全量重生成),可以通过主键+时间戳实现精准同步:
- 前置准备:给Redshift聚合表添加
last_updated_at时间戳字段,每次数据新增/更新时自动更新该字段;同时确保表有唯一主键(比如id)。 - 同步流程:
- 记录每次同步的结束时间(比如存在MySQL的一个控制表
sync_control中) - 从Redshift同步上次结束时间到当前时间的所有变更数据(新增/更新)到MySQL临时表
- 执行三步同步:
-- 更新现有行 UPDATE your_target_table t JOIN tmp_sync_data tmp ON t.id = tmp.id SET t.col1 = tmp.col1, t.col2 = tmp.col2, ..., t.last_updated_at = tmp.last_updated_at; -- 插入新增行 INSERT INTO your_target_table SELECT * FROM tmp_sync_data WHERE id NOT IN (SELECT id FROM your_target_table); -- 删除Redshift中已不存在的行(如果需要) DELETE FROM your_target_table WHERE last_updated_at < (SELECT last_sync_time FROM sync_control); - 更新
sync_control中的同步时间为当前时间
- 记录每次同步的结束时间(比如存在MySQL的一个控制表
- 优化点:更新和删除操作按主键范围分批执行(比如
WHERE id BETWEEN 1 AND 1000),避免一次性锁表;如果Redshift有批量删除操作,可单独记录删除的主键列表,同步到MySQL后批量删除。
方案三:AWS托管服务组合(低代码维护)
如果不想自己写同步脚本,用AWS原生服务组合可以实现托管式同步:
- AWS Glue:作为ETL工具,配置Crawler识别Redshift和Aurora的表结构,创建同步Job:
- 全量同步:Glue读取Redshift全表数据,写入Aurora临时表,再执行原子切换
- 增量同步:利用Redshift表的
last_updated_at字段,Glue只同步上次同步后的变更数据,自动处理插入、更新、删除
- CloudWatch Events:定时触发Glue Job,满足每日多次同步的需求
- 优势:无需维护服务器和脚本,AWS托管保证稳定性;支持自动 schema 适配,减少数据类型兼容问题
关键注意事项
- 确保Redshift与MySQL表的主键完全一致,这是精准匹配行的核心
- 处理数据类型兼容:比如Redshift的
TIMESTAMPTZ要转换为MySQL的DATETIME,DECIMAL精度要对齐 - 监控同步状态:用CloudWatch监控Glue Job运行状态,或自定义脚本记录同步日志,失败时及时告警
- 大表同步尽量选业务低峰期执行,减少对MySQL业务的影响
内容的提问来源于stack exchange,提问作者K.N. Bhargav
相关产品推荐
相关产品推荐

