跨账户迁移-快照
- 难度等级: 中级
- 预计耗时: 2-4 小时(取决于数据库大小)
- 适用环境: AWS RDS for MySQL (Community Edition)
- 仅适用于 Single-AZ DB Instance 或 Multi-AZ DB Instance 部署
- 不适用于 Multi-AZ DB Cluster 部署
- 不适用于 使用默认KMS加密
- 源账户和目标账户均有必要权限
将 AWS 账户 A 中的 RDS for MySQL 实例,通过快照共享方式迁移至 AWS 账户 B。
关键限制条件(必读)
Section titled “关键限制条件(必读)”限制 1: 部署类型限制
Section titled “限制 1: 部署类型限制”Multi-AZ DB Cluster 不支持快照功能,无法使用本方案。
如何判断部署类型:
- RDS 控制台 > 选择实例 > 配置标签页
- 如果显示 “Multi-AZ DB cluster”:本文档不适用
- 如果显示 “Multi-AZ” 且只有一个实例标识符:可以使用本方案
限制 2: 加密密钥限制(阻断性)
Section titled “限制 2: 加密密钥限制(阻断性)”这是最关键的限制,90% 的迁移失败都是因为忽略此项。
- RDS 控制台 > 选择源实例 > 配置标签页 > 加密部分
- 查看 AWS KMS密钥为aws/rds(AWS托管密钥不可共享)
情况 A:未加密
- 显示 “Not enabled” 或 “加密:否”
- 可以使用本方案
情况 B:使用客户托管密钥
- 显示类似
arn:aws:kms:region:account-id:key/xxxxx - 密钥别名不是
aws/rds - 可以使用本方案(需额外步骤共享密钥)
情况 C:使用 AWS 托管密钥
- 显示
aws/rds或(default) aws/rds - 本文档方案完全不可行
- 必须使用其他迁移方式
为什么 aws/rds 密钥是阻断性问题:
Section titled “为什么 aws/rds 密钥是阻断性问题:”- AWS 托管密钥由 AWS 服务管理,用户无权限操作
- AWS 不允许将 aws/rds 密钥共享给其他账户
- 使用此密钥加密的快照无法跨账户共享
- 无法在复制快照时更换密钥所有者
- 这不是配置错误,是 AWS 的硬性安全限制
aws/rds 加密实例的替代迁移方案:
Section titled “aws/rds 加密实例的替代迁移方案:”| 方案 | 停机时间 | 复杂度 | 说明 |
|---|---|---|---|
| AWS DMS | 最小(分钟级) | 中 | 推荐,支持在线迁移 |
| mysqldump | 长(小时级) | 低 | 导出 SQL 后在目标账户导入 |
| 先转客户密钥再快照 | 长(小时级) | 高 | 在源账户创建新实例使用客户密钥,数据迁移后再快照共享 |
如果源实例使用 aws/rds 加密,请停止阅读本文档,改用上述方案。
在开始迁移前,必须满足:
权限要求:
- 源账户:
rds:CreateDBSnapshot,rds:ModifyDBSnapshotAttribute,kms:CreateGrant(如加密) - 目标账户:
rds:RestoreDBInstanceFromDBSnapshot,rds:CreateDBInstance
已确认:
- 源实例不是 Multi-AZ DB Cluster
- 源实例未加密,或使用客户托管的 KMS 密钥
- 已获取源账户和目标账户的 12 位账户 ID
- 已规划停机时间窗口并获得批准
已记录源实例信息:
- 实例规格(如 db.t3.large)
- MySQL 版本号(如 8.0.35)
- 参数组自定义参数
- 选项组配置(如有)
- 安全组入站规则
- 子网组和可用区配置
停机时间评估
Section titled “停机时间评估”| 数据库大小 | 快照创建 | 共享+复制 | 还原实例 | 验证+切换 | 总计 |
|---|---|---|---|---|---|
| < 100GB | 10-20分钟 | 5-10分钟 | 15-30分钟 | 10-15分钟 | 40-75分钟 |
| 100GB-500GB | 30-60分钟 | 10-15分钟 | 30-90分钟 | 15-20分钟 | 1.5-3小时 |
| 500GB-1TB | 1-2小时 | 15-20分钟 | 1-3小时 | 20-30分钟 | 2.5-5.5小时 |
| > 1TB | 2-4小时 | 20-30分钟 | 3-6小时 | 30-45分钟 | 6-11小时 |
影响因素:
- IOPS 配置(预配置 IOPS 更快)
- 数据库写入活跃度
- 跨区域迁移会增加 20-50% 时间
1. 准备目标账户资源
Section titled “1. 准备目标账户资源”在开始快照前,先在目标账户创建必要资源,避免还原时使用默认配置。
1.1 创建 VPC 资源
如果目标账户没有合适的 VPC:
1.2 创建安全组
复制源环境的安全组规则:
- 入站规则:允许应用服务器的 IP/安全组访问 3306 端口
- 出站规则:通常允许所有出站
1.3 创建参数组
- RDS 控制台 > 参数组 > 创建参数组
- 选择与源实例相同的 MySQL 版本族(如 mysql8.0)
- 从源账户导出参数配置:
- 源账户 RDS 控制台 > 参数组 > 查看详细信息
- 记录所有非默认值参数
- 在目标账户参数组中应用相同配置
关键参数示例(根据实际情况):
max_connectionsinnodb_buffer_pool_sizecharacter_set_servermax_allowed_packet1.4 创建选项组(如需要)
如果源实例使用选项组(如 MariaDB Audit Plugin):
- 创建相同版本的选项组
- 添加相同选项
架构师建议:提前创建这些资源的原因是避免还原快照时使用默认配置,导致性能问题或配置不一致。
2. 创建并共享快照
Section titled “2. 创建并共享快照”2.1 在源账户创建手动快照
- RDS 控制台 > 数据库 > 选择源实例
- 操作 > 创建快照
- 快照名称建议格式:
migration-[db-identifier]-[YYYYMMDD-HHMM]- 示例:
migration-prod-mysql-20241215-1400
- 示例:


创建快照时的行为:
- 单可用区实例:I/O 会短暂暂停(通常 < 10 秒)
- 多可用区实例:从备用实例创建,主实例不受影响
- 数据库保持在线,应用可继续访问
2.2 等待快照可用
- 快照列表中查看状态
- 状态从 “正在创建” 变为 “available”
- 小于 100GB 通常 10-20 分钟,更大数据库需更长时间
2.3 共享快照到目标账户
未加密快照:
- 选择创建的快照
- 操作 > 共享快照
- “AWS 账户 ID” 输入目标账户的 12 位账户 ID
- 添加


使用客户托管密钥加密的快照:
必须同时共享快照和 KMS 密钥。
步骤 A:共享 KMS 密钥
- 在源账户,打开 KMS 控制台
- 找到加密该 RDS 的 KMS 密钥
- 密钥策略 > 编辑
- 添加以下策略(替换目标账户 ID):

!!!tip KMS授权的目的不是让目标账户在KMS控制台看到密钥,而是让目标账户在复制快照时能够解密源数据。 :::
- 保存更改
步骤 B:共享快照
同未加密快照步骤,输入目标账户 ID。
架构师建议:
- KMS 密钥共享后,目标账户可以看到密钥但无法管理
- 还原后建议在目标账户使用新的 KMS 密钥重新加密,实现完全的安全隔离
- 迁移完成后,可以撤销源账户的 KMS 密钥共享
3. 在目标账户还原快照
Section titled “3. 在目标账户还原快照”3.1 查找共享的快照
- 登录目标账户的 RDS 控制台
- 快照 > 与我共享的快照
- 找到源账户共享的快照
跨区域迁移的额外步骤:
如果需要在不同区域还原:
- 在”与我共享的快照”中选择快照
- 操作 > 复制快照
- 选择目标区域
- 如果源快照加密,选择目标区域的 KMS 密钥进行重新加密
- 等待复制完成(取决于快照大小和区域间网络)

3.2 还原快照为新实例
- 选择快照(复制后的)
- 操作 > 还原快照
- 配置实例参数:
数据库实例设置:
- DB 实例标识符:新实例名称
- DB 实例类:推荐与源实例相同或更高
- 存储类型:与源实例一致
- 已分配存储:自动设置为快照大小,可以增加但不能减少
网络设置:
- Virtual Private Cloud (VPC):选择准备好的 VPC
- 子网组:选择创建的 DB 子网组
- 公开访问:根据需求(生产环境通常选择”否”)
- VPC 安全组:选择创建的安全组
- 可用区:可选择或让 AWS 自动分配
数据库选项:
- DB 参数组:选择预创建的参数组(不要用默认)
- 选项组:选择预创建的选项组(如适用)
备份设置:
- 备份保留期:推荐 7-30 天
- 备份时段:选择业务低峰期
加密设置(如源快照加密):
- 同区域还原:自动继承源快照的加密设置
- 跨区域还原:已在复制时选择新密钥
其他设置:
- 启用多可用区部署:生产环境强烈推荐启用
- 启用删除保护:生产环境推荐启用
- 启用性能详情:推荐启用(7 天免费)
- 还原数据库快照
3.3 等待实例可用
- 数据库列表查看状态
- 状态从 “正在创建” > “backing-up” > “available”
- 100GB 数据库通常 15-30 分钟,大型数据库需数小时
- 记录新实例的终端节点

架构师建议:
- 初始测试阶段可以使用较小实例类型(如 db.t3.medium)以节省成本
- 验证数据完整性后,再修改为生产规格
- 多可用区部署会增加约 30-50% 的还原时间,但提供高可用性保障

风险评估与缓解
Section titled “风险评估与缓解”| 风险项 | 严重程度 | 影响 | 缓解措施 | 发生概率 |
|---|---|---|---|---|
| 源实例使用 aws/rds 密钥加密 | 阻断性 | 无法执行快照迁移 | 迁移前检查加密密钥类型 | 高(默认配置) |
| Multi-AZ DB Cluster 部署 | 阻断性 | 不支持快照功能 | 迁移前确认部署类型 | 低 |
| 参数组配置遗漏 | 高 | 性能下降或功能异常 | 提前创建参数组并验证 | 中 |
| 安全组配置错误 | 高 | 应用无法连接数据库 | 充分测试网络连通性 | 中 |
| 数据不一致 | 高 | 业务数据错误 | 执行多层数据验证 | 低 |
| KMS 密钥权限问题 | 中 | 无法还原加密快照 | 提前配置密钥策略 | 中(加密场景) |
| 跨区域网络延迟 | 中 | 复制时间超预期 | 预留充足时间窗口 | 中(跨区域) |
| 实例规格不足 | 中 | 性能问题 | 使用相同或更高规格 | 低 |
| DNS 缓存导致切换延迟 | 低 | 切换时间延长 | 提前降低 TTL | 中 |
| 快照创建期间 I/O 暂停 | 低 | 短暂性能影响 | 选择低峰期创建快照 | 高(单可用区) |
Q: 如何判断我的 RDS 是否使用 aws/rds 加密?
A: RDS 控制台 > 选择实例 > 配置标签页 > 加密部分。如果看到 aws/rds 或 (default) aws/rds,则使用 AWS 托管密钥,无法使用快照方式跨账户迁移。
Q: aws/rds 加密的实例如何跨账户迁移?
A: 快照方式不可行,必须使用:
- AWS DMS(推荐):支持最小停机时间在线迁移
- mysqldump:导出 SQL 文件后在目标账户导入
- 先迁移到客户密钥加密的实例:在源账户创建新实例使用客户托管密钥,迁移数据后再快照共享
Q: 如何判断是 Multi-AZ DB Cluster 还是 Multi-AZ DB Instance?
A: RDS 控制台 > 选择实例 > 配置标签页:
- Multi-AZ DB Cluster:显示 “Multi-AZ DB cluster”,有多个实例标识符(1 个写入器 + N 个读取器)
- Multi-AZ DB Instance:显示 “Multi-AZ”,只有一个实例标识符
Q: Multi-AZ DB Cluster 如何跨账户迁移?
A: 不支持快照功能,无法使用本文档方案。替代方案:
- AWS DMS
- binlog 主从复制
- mysqldump 导出/导入
Q: 跨区域迁移需要注意什么?
A:
- 在目标账户先复制快照到目标区域
- 数据传输时间取决于快照大小(100GB 约 15-30 分钟)
- 跨区域会产生数据传输费用
- 如果加密,需要在目标区域使用新的 KMS 密钥
Q: 是否可以在还原时升级 MySQL 版本?
A:
- 可以升级到兼容的更高版本(如 8.0.28 升级到 8.0.35)
- 不能降级版本
- 主版本升级(如 5.7 到 8.0)可能有兼容性问题,建议先还原相同版本,验证后再单独升级
Q: 快照包含哪些内容?
A: 快照包含:
- 所有数据库和表数据
- 数据库用户和权限
- 存储过程、触发器、函数
- 参数配置(作为实例配置的一部分)
快照不包含:
- 实例级别的配置(需手动配置)
- 应用程序代码
Q: 还原后是否可以修改实例规格?
A: 可以。还原后可以随时修改实例类型,建议:
- 初始还原时使用较小规格进行测试
- 验证数据完整性
- 修改到生产规格
- 修改实例类型需要重启,选择维护窗口或立即应用
Q: 如何处理数据库主用户密码?
A:
- 快照包含所有数据库用户但密码已加密
- 还原时可以重新设置主用户密码
- 或保持与源实例相同的密码
- 应用用户密码保持不变
Q: 源数据库在快照创建和迁移期间可以继续使用吗?
A:
- 创建快照:数据库保持在线,可正常访问
- 单可用区:I/O 可能短暂暂停(< 10 秒)
- 多可用区:从备用实例创建,主实例无影响
- 共享快照:完全无影响
- 最终切换:需要停止写入以确保数据一致性
Q: 快照迁移会丢失数据吗?
A:
- 快照是时间点备份,创建快照之后的写入不会包含在目标库
- 这不是数据丢失,而是设计行为
- 通过在切换前创建最终快照,并停止源库写入来避免差异
Q: 是否需要停机?
A: 需要短暂停机(用于最终切换):
- 小型数据库(< 100GB):40-75 分钟
- 中型数据库(100GB-500GB):1.5-3 小时
- 大型数据库(500GB-1TB):2.5-5.5 小时
- 大部分时间用于快照创建和还原,真正业务停止时间是切换窗口(通常 10-30 分钟)
Q: 迁移后性能下降怎么办?
A: 检查:
- 实例类型是否与源一致
- 参数组配置是否正确
- 安全组和网络路径是否优化
- 是否启用了增强监控
- CloudWatch 指标识别瓶颈(CPU/内存/IOPS)
Q: 迁移成本是多少?
A: 主要成本:
- 快照存储费用(按 GB/月)
- 目标实例运行费用
- 跨区域数据传输费用(如适用)
- 重叠期间源和目标实例同时运行的费用
架构决策记录
Section titled “架构决策记录”为什么选择快照共享而不是其他方案?
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 快照共享 | 操作简单,数据一致性好,风险可控 | 需要停机,不支持 aws/rds 加密 | 未使用 aws/rds 加密的标准迁移 |
| AWS DMS | 最小停机时间,支持所有加密类型 | 配置复杂,成本较高,需验证数据一致性 | 生产系统,aws/rds 加密场景 |
| mysqldump | 简单,跨平台 | 停机时间长,大数据库不适用 | 小型数据库,测试环境 |
| binlog 复制 | 接近零停机 | 配置复杂,需要专业技能 | 超大型数据库,不能接受停机 |
快照共享是以下场景的最佳选择:
- 数据库大小 < 1TB
- 可接受 2-6 小时停机窗口
- 未使用 aws/rds 默认加密或使用客户托管密钥
- 团队熟悉 AWS RDS 操作
- 希望降低操作复杂度和风险
为什么要提前创建参数组和选项组?
还原快照时如果不指定自定义参数组:
- 使用默认参数组
- 默认配置通常不适合生产环境(如 max_connections 过小)
- 事后修改参数需要重启数据库
- 提前创建避免二次停机和配置错误
为什么推荐启用多可用区?
生产环境强烈推荐多可用区部署:
- 自动故障转移(通常 < 2 分钟)
- 维护零停机(补丁和升级在备用实例)
- 数据持久性保障
- 成本增加约 2 倍,但换取高可用性
graph TD
A[开始跨账户迁移] --> B{检查部署类型}
B -->|Multi-AZ DB Cluster| C[无法使用快照<br/>改用 DMS 或 binlog]
B -->|Single/Multi-AZ Instance| D{检查加密状态}
D -->|未加密| E[可以使用快照迁移]
D -->|已加密| F{检查密钥类型}
F -->|aws/rds| G[无法使用快照<br/>改用 DMS]
F -->|客户托管密钥| H[可以使用快照迁移<br/>需额外共享 KMS 密钥]
E --> I[执行快照迁移流程]
H --> J[共享 KMS 密钥]
J --> I
I --> K[创建快照]
K --> L[共享快照]
L --> M{是否跨区域?}
M -->|是| N[复制快照到目标区域]
M -->|否| O[直接还原]
N --> O
O --> P[完成迁移]
style C fill:#ffcccc
style G fill:#ffcccc
style E fill:#ccffcc
style H fill:#ffffcc
style P fill:#ccffcc
AWS 官方文档:
相关主题: