Skip to content

跨账户迁移-快照

  • 难度等级: 中级
  • 预计耗时: 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。

Multi-AZ DB Cluster 不支持快照功能,无法使用本方案。

如何判断部署类型:

  • RDS 控制台 > 选择实例 > 配置标签页
  • 如果显示 “Multi-AZ DB cluster”:本文档不适用
  • 如果显示 “Multi-AZ” 且只有一个实例标识符:可以使用本方案

限制 2: 加密密钥限制(阻断性)

Section titled “限制 2: 加密密钥限制(阻断性)”

这是最关键的限制,90% 的迁移失败都是因为忽略此项。

  1. RDS 控制台 > 选择源实例 > 配置标签页 > 加密部分
  2. 查看 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)
  • 参数组自定义参数
  • 选项组配置(如有)
  • 安全组入站规则
  • 子网组和可用区配置
数据库大小快照创建共享+复制还原实例验证+切换总计
< 100GB10-20分钟5-10分钟15-30分钟10-15分钟40-75分钟
100GB-500GB30-60分钟10-15分钟30-90分钟15-20分钟1.5-3小时
500GB-1TB1-2小时15-20分钟1-3小时20-30分钟2.5-5.5小时
> 1TB2-4小时20-30分钟3-6小时30-45分钟6-11小时

影响因素:

  • IOPS 配置(预配置 IOPS 更快)
  • 数据库写入活跃度
  • 跨区域迁移会增加 20-50% 时间

在开始快照前,先在目标账户创建必要资源,避免还原时使用默认配置。

1.1 创建 VPC 资源

如果目标账户没有合适的 VPC:

  1. 创建 VPC 和子网
  2. 至少 2 个不同可用区的私有子网(用于 RDS)
  3. 创建 DB 子网组

1.2 创建安全组

复制源环境的安全组规则:

  1. 入站规则:允许应用服务器的 IP/安全组访问 3306 端口
  2. 出站规则:通常允许所有出站

1.3 创建参数组

  1. RDS 控制台 > 参数组 > 创建参数组
  2. 选择与源实例相同的 MySQL 版本族(如 mysql8.0)
  3. 从源账户导出参数配置:
    • 源账户 RDS 控制台 > 参数组 > 查看详细信息
    • 记录所有非默认值参数
  4. 在目标账户参数组中应用相同配置

关键参数示例(根据实际情况):

max_connections
innodb_buffer_pool_size
character_set_server
max_allowed_packet

1.4 创建选项组(如需要)

如果源实例使用选项组(如 MariaDB Audit Plugin):

  1. 创建相同版本的选项组
  2. 添加相同选项

架构师建议:提前创建这些资源的原因是避免还原快照时使用默认配置,导致性能问题或配置不一致。

2.1 在源账户创建手动快照

  1. RDS 控制台 > 数据库 > 选择源实例
  2. 操作 > 创建快照
  3. 快照名称建议格式:migration-[db-identifier]-[YYYYMMDD-HHMM]
    • 示例:migration-prod-mysql-20241215-1400

创建快照界面

拍摄快照

创建快照时的行为

  • 单可用区实例:I/O 会短暂暂停(通常 < 10 秒)
  • 多可用区实例:从备用实例创建,主实例不受影响
  • 数据库保持在线,应用可继续访问

2.2 等待快照可用

  1. 快照列表中查看状态
  2. 状态从 “正在创建” 变为 “available”
  3. 小于 100GB 通常 10-20 分钟,更大数据库需更长时间

2.3 共享快照到目标账户

未加密快照

  1. 选择创建的快照
  2. 操作 > 共享快照
  3. “AWS 账户 ID” 输入目标账户的 12 位账户 ID
  4. 添加

快照设置

共享快照设置

使用客户托管密钥加密的快照

必须同时共享快照和 KMS 密钥。

步骤 A:共享 KMS 密钥

  1. 在源账户,打开 KMS 控制台
  2. 找到加密该 RDS 的 KMS 密钥
  3. 密钥策略 > 编辑
  4. 添加以下策略(替换目标账户 ID):

授权其他账户

!!!tip KMS授权的目的不是让目标账户在KMS控制台看到密钥,而是让目标账户在复制快照时能够解密源数据。 :::

  1. 保存更改

步骤 B:共享快照

同未加密快照步骤,输入目标账户 ID。

架构师建议

  • KMS 密钥共享后,目标账户可以看到密钥但无法管理
  • 还原后建议在目标账户使用新的 KMS 密钥重新加密,实现完全的安全隔离
  • 迁移完成后,可以撤销源账户的 KMS 密钥共享

3.1 查找共享的快照

  1. 登录目标账户的 RDS 控制台
  2. 快照 > 与我共享的快照
  3. 找到源账户共享的快照

跨区域迁移的额外步骤

如果需要在不同区域还原:

  1. 在”与我共享的快照”中选择快照
  2. 操作 > 复制快照
  3. 选择目标区域
  4. 如果源快照加密,选择目标区域的 KMS 密钥进行重新加密
  5. 等待复制完成(取决于快照大小和区域间网络)

跨区域复制快照

3.2 还原快照为新实例

  1. 选择快照(复制后的)
  2. 操作 > 还原快照
  3. 配置实例参数:

数据库实例设置

  • DB 实例标识符:新实例名称
  • DB 实例类:推荐与源实例相同或更高
  • 存储类型:与源实例一致
  • 已分配存储:自动设置为快照大小,可以增加但不能减少

网络设置

  • Virtual Private Cloud (VPC):选择准备好的 VPC
  • 子网组:选择创建的 DB 子网组
  • 公开访问:根据需求(生产环境通常选择”否”)
  • VPC 安全组:选择创建的安全组
  • 可用区:可选择或让 AWS 自动分配

数据库选项

  • DB 参数组:选择预创建的参数组(不要用默认)
  • 选项组:选择预创建的选项组(如适用)

备份设置

  • 备份保留期:推荐 7-30 天
  • 备份时段:选择业务低峰期

加密设置(如源快照加密):

  • 同区域还原:自动继承源快照的加密设置
  • 跨区域还原:已在复制时选择新密钥

其他设置

  • 启用多可用区部署:生产环境强烈推荐启用
  • 启用删除保护:生产环境推荐启用
  • 启用性能详情:推荐启用(7 天免费)
  1. 还原数据库快照

3.3 等待实例可用

  1. 数据库列表查看状态
  2. 状态从 “正在创建” > “backing-up” > “available”
  3. 100GB 数据库通常 15-30 分钟,大型数据库需数小时
  4. 记录新实例的终端节点

还原快照

架构师建议

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

完成创建

风险项严重程度影响缓解措施发生概率
源实例使用 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: 可以。还原后可以随时修改实例类型,建议:

  1. 初始还原时使用较小规格进行测试
  2. 验证数据完整性
  3. 修改到生产规格
  4. 修改实例类型需要重启,选择维护窗口或立即应用

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: 检查:

  1. 实例类型是否与源一致
  2. 参数组配置是否正确
  3. 安全组和网络路径是否优化
  4. 是否启用了增强监控
  5. CloudWatch 指标识别瓶颈(CPU/内存/IOPS)

Q: 迁移成本是多少?

A: 主要成本:

  • 快照存储费用(按 GB/月)
  • 目标实例运行费用
  • 跨区域数据传输费用(如适用)
  • 重叠期间源和目标实例同时运行的费用

为什么选择快照共享而不是其他方案?

方案优点缺点适用场景
快照共享操作简单,数据一致性好,风险可控需要停机,不支持 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 官方文档

相关主题