Skip to content

DMS迁移说明

  • 难度等级: 中级
  • 预计时长: 2-4 小时(不含数据同步时间)
  • 适用场景: 跨账号迁移 RDS for MySQL Community 8.4 Multi-AZ Cluster
  • 目标架构: Multi-AZ Cluster → 非集群实例(或集群)

将源账号的 RDS MySQL Multi-AZ Cluster 通过 AWS DMS 迁移至目标账号,实现最小化停机时间(< 10 分钟)的数据库迁移。


  • 网络连通性测试完成
  • 源端 binlog 配置确认
  • DMS 用户创建并验证权限
  • 目标库创建并参数配置
  • DMS 复制实例创建
  • 源端和目标端终端节点测试连接成功
  • 迁移任务配置审查
  • 监控告警配置完成

在开始迁移前,请确认以下条件:

  • 已建立跨账号 VPC Peering 或 Transit Gateway 连接
  • 源端和目标端 RDS 安全组允许 DMS 访问(端口 3306)
  • 路由表已正确配置
  • 自动备份已启用(Multi-AZ Cluster 默认启用)
  • Binlog 格式为 ROW(默认配置)
  • Binlog 保留时间 ≥ 24 小时
  • 源账号:创建跨账号访问 IAM 角色
  • 目标账号:DMS 服务角色(dms-vpc-roledms-cloudwatch-logs-role

为什么选择 DMS:对于 RDS Multi-AZ Cluster,DMS 是推荐方案,原因:

  1. Multi-AZ Cluster 不支持跨账号快照共享
  2. CDC(持续数据捕获)将停机时间压缩至业务切换窗口(< 10 分钟)
  3. 提供数据验证功能,确保迁移一致性
  4. 原生支持跨账号迁移

引擎版本: MySQL 必须与源端相同
实例规格: 建议初始与源端一致
部署选项: 可选 Single-AZ、Multi-AZ 或 Multi-AZ Cluster
参数组: 根据源端自定义参数创建
字符集: 必须与源端一致

架构兼容性说明

  • Multi-AZ Cluster → 非集群实例:完全支持
  • Multi-AZ Cluster → Multi-AZ Cluster:完全支持
  • DMS 执行逻辑复制,底层架构差异不影响迁移

配置建议

  • 如目标为非集群实例,建议配置充足 IOPS(≥ 12,000)
  • 存储空间至少为源库的 1.5 倍
  • 启用 Performance Insights 便于监控

[创建目标RDS实例]


graph LR
    A[源账号 RDS Multi-AZ Cluster] -->|VPC Peering| B[DMS复制实例]
    B -->|目标账号VPC| C[目标RDS实例]
    
    style A fill:#e1f5ff
    style C fill:#e1f5ff
    style B fill:#fff4e1

方案选择

  • 推荐:Transit Gateway(便于多账号管理)
  • 备选:VPC Peering(成本更低)

安全组配置

DMS 复制实例安全组:
- 出站: 允许访问源端和目标端(3306)
源端 RDS 安全组:
- 入站: 允许来自 DMS 复制实例(3306)
目标端 RDS 安全组:
- 入站: 允许来自 DMS 复制实例(3306)

[网络配置示意图]


决策矩阵

数据库大小日均变更量推荐规格内存说明
< 100 GBdms.t3.medium4 GB开发测试
100-500 GB中等dms.c6.xlarge8 GB生产推荐
> 500 GBdms.r6.xlarge32 GB内存优化

关键配置说明

内存优先于磁盘:DMS 采用流式复制架构,数据在内存中实时处理并转发,本地磁盘仅用于缓存 CDC 事务日志和任务日志。因此:

  • 内存大小直接影响迁移性能(数据转换速度、并行处理能力)
  • 磁盘空间仅需满足日志缓存需求,无需匹配源数据库大小

存储空间配置

  • 对于 100 GB 源数据库,推荐配置 50-100 GB 存储空间
  • 计算公式:存储空间 = MAX(50 GB, 每小时变更量 × 缓存小时数)
  • 示例:中等负载(2 GB/小时变更),缓存 12 小时 = 24 GB,配置 50 GB 留余量

实例系列选择

  • C6 系列(计算优化):生产环境标准选择,CPU 和内存均衡
  • R6 系列(内存优化):需更快迁移速度或大量并行表时选择
  • T3 系列(通用突发):仅适合开发测试环境

性能提升关键:如需加速迁移,应优先选择内存更大的实例(如从 C6 升级到 R6),而非增加磁盘空间。监控 MemoryFreeableSwapUsage 指标,确保剩余内存 > 20% 且无交换空间使用。

VPC: 可访问源端和目标端的 VPC
子网组: 私有子网
安全组: 允许访问源端和目标端 RDS
公开访问: 禁用(最佳实践)

Multi-AZ 复制实例

  • 生产环境:启用(避免单点故障)
  • 开发测试:可选(降低成本)

[DMS复制实例配置]


MySQL 8.0/8.4 所需权限

-- 创建 DMS 用户
CREATE USER 'dmsuser'@'%' IDENTIFIED BY 'your_secure_password';
-- 全局权限(CDC 必需)
GRANT REPLICATION CLIENT ON *.* TO 'dmsuser'@'%';
GRANT REPLICATION SLAVE ON *.* TO 'dmsuser'@'%';
GRANT EVENT ON *.* TO 'dmsuser'@'%';
-- 目标数据库权限
GRANT SELECT ON `your_database`.* TO 'dmsuser'@'%';
-- 系统库权限
GRANT SELECT ON performance_schema.* TO 'dmsuser'@'%';
GRANT SELECT ON `mysql`.* TO 'dmsuser'@'%';
GRANT CREATE TEMPORARY TABLES ON `mysql`.* TO 'dmsuser'@'%';
-- 刷新权限
FLUSH PRIVILEGES;

RDS 环境注意事项

  • RDS 限制对 mysql 数据库的直接授权,但这不影响 DMS 工作
  • DMS 会通过 RDS API 自动获取必要的系统权限
  • 如遇到 “Access denied to database ‘mysql’” 错误,可忽略,已授予的权限足够

端点类型: 源端
引擎类型: MySQL
服务器名称: 源 RDS Multi-AZ Cluster 写入器端点
格式: mydb-cluster.cluster-xxx.region.rds.amazonaws.com
端口: 3306
用户名: dmsuser
密码: [上一步创建的密码]

是否启用 SSL: 推荐启用

原因

  • 跨账号数据传输涉及网络安全合规要求
  • 对性能影响约 5-10%,可接受

配置方式

  1. 下载 RDS CA 证书
  2. 在终端节点中上传证书
  3. SSL 模式选择 require

[源端终端节点配置]


端点类型: 目标
引擎类型: MySQL
服务器名称: 目标 RDS 实例端点
端口: 3306
用户名: 具有完整写入权限的用户
密码: [目标库密码]

Target metadata

{
"initstmt": "SET FOREIGN_KEY_CHECKS=0;",
"ParallelLoadThreads": 4
}

说明

  • initstmt:加速初始加载,迁移完成后会自动恢复
  • ParallelLoadThreads:Multi-AZ Cluster 推荐值为 4

[目标端终端节点配置]


推荐选择: “迁移现有数据并复制持续更改”(全量 + 增量)

原因: 包含全量和 CDC,适合生产环境最小化停机。

选择要迁移的数据库

建议开启迁移前评估,这将有助于评估迁移前的环境以及配置是否符合DMS标准;

  1. 保持默认即可
  2. 建议开启在执行数据迁移的情况下验证

迁移任务配置


复制实例的CloudWatch指标页面可以看到常规监控指标;如果需要详细监控,可以使用CloudWatch控制台创建。

监控指标

CloudWatch 指标

指标名称正常范围说明
CDCLatencySource< 10 秒CDC 延迟时间
FullLoadThroughputRowsSource-全量加载速率
FreeStorageSpace> 20%复制实例可用空间
MemoryFreeable> 20%可用内存

全量加载阶段

时间 = 数据量 / (网络带宽 × 利用率 × 压缩比)
示例: 500 GB / (1 Gbps × 0.7 × 1.5) ≈ 2 小时

CDC 追平阶段

  • 通常 10-30 分钟
  • 监控 CDCLatencySource < 10 秒表示已追平

为什么需要手动迁移

AWS DMS 设计为最小化迁移工具,仅创建数据迁移所需的最小对象集。根据 AWS 官方文档,DMS 不会自动迁移以下数据库对象:

DMS 会迁移的对象

  • 表结构(Tables)
  • 主键(Primary Keys)
  • 唯一键(Unique Keys,如果没有主键)
  • NOT NULL 约束
  • 表数据

DMS 不会迁移的对象(需手动处理):

  • 存储过程(Stored Procedures)
  • 函数(Functions)
  • 触发器(Triggers)
  • 事件调度器(Events)
  • 视图(Views)
  • 二级索引(Secondary Indexes)
  • 外键约束(Foreign Key Constraints)
  • 默认值(Default Values)

步骤 1: 导出数据库对象

# 导出完整的数据库对象定义(存储过程、函数、触发器、事件)
mysqldump -h source-host -u dms_user -p \
--no-data \
--routines \
--events \
--triggers \
database_name > database_objects.sql
# 仅导出存储过程和函数
mysqldump -h source-host -u dms_user -p \
--no-data \
--no-create-info \
--no-create-db \
--routines \
--skip-opt \
database_name > routines.sql
# 仅导出触发器
mysqldump -h source-host -u dms_user -p \
--no-data \
--no-create-info \
--triggers \
database_name > triggers.sql

步骤 2: 验证导出内容

# 查看导出的对象
grep -i "CREATE PROCEDURE\|CREATE FUNCTION\|CREATE TRIGGER\|CREATE EVENT" database_objects.sql

步骤 3: 导入到目标库

# 导入所有对象
mysql -h target-host -u admin -p database_name < database_objects.sql
# 如果目标库启用了 binlog,可能需要设置参数
mysql -h target-host -u admin -p -e "SET GLOBAL log_bin_trust_function_creators = 1;"
mysql -h target-host -u admin -p database_name < database_objects.sql

步骤 4: 验证导入结果

-- 验证存储过程
SHOW PROCEDURE STATUS WHERE Db = 'database_name';
-- 验证函数
SHOW FUNCTION STATUS WHERE Db = 'database_name';
-- 验证触发器
SHOW TRIGGERS FROM database_name;
-- 验证事件
SHOW EVENTS FROM database_name;
-- 验证视图
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE = 'VIEW';

DMS 不会创建二级索引,仅迁移主键。手动创建索引:

-- 在源库查看索引
SHOW INDEX FROM table_name WHERE Key_name != 'PRIMARY';
-- 在目标库创建索引
CREATE INDEX idx_column_name ON table_name(column_name);
CREATE INDEX idx_multi_column ON table_name(col1, col2);

最佳实践

  • 在数据迁移完成后创建索引(避免影响迁移性能)
  • 使用 ALGORITHM=INPLACE 进行在线索引创建(MySQL 5.6+)

DMS 不会创建外键约束。手动添加:

-- 在源库查看外键
SELECT
CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'database_name'
AND REFERENCED_TABLE_NAME IS NOT NULL;
-- 在目标库创建外键
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES parent_table(column_name)
ON DELETE CASCADE
ON UPDATE CASCADE;

重建 MySQL 用户和权限:

-- 在源库导出用户和权限
SELECT CONCAT(
'CREATE USER ''', user, '''@''', host, ''' IDENTIFIED BY ''[PASSWORD]'';'
) AS create_user
FROM mysql.user
WHERE user NOT IN ('root', 'mysql.sys', 'mysql.session', 'rdsadmin', 'dmsuser');
-- 导出权限
SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS show_grants
FROM mysql.user
WHERE user NOT IN ('root', 'mysql.sys', 'mysql.session', 'rdsadmin', 'dmsuser');
-- 在目标库执行
CREATE USER 'app_user'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO 'app_user'@'%';
GRANT EXECUTE ON database_name.* TO 'app_user'@'%'; -- 如有存储过程
FLUSH PRIVILEGES;

确认目标库参数与源库一致:

-- 对比关键参数
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW VARIABLES LIKE 'sql_mode';
SHOW VARIABLES LIKE 'max_allowed_packet';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

迁移以下配置到目标库:

CloudWatch 告警规则

  • CPU 利用率告警
  • 磁盘空间告警
  • 数据库连接数告警
  • 复制延迟告警(如有只读副本)

Performance Insights

  • 启用 Performance Insights
  • 配置数据保留期限
  • 设置性能基线

增强监控

  • 启用增强监控
  • 配置监控粒度(建议 60 秒)

准备连接信息

源端连接信息(停用):
- 端点: source-cluster.cluster-xxx.region.rds.amazonaws.com
- 端口: 3306
- 数据库: database_name
目标端连接信息(启用):
- 端点: target-instance.xxx.region.rds.amazonaws.com
- 端口: 3306
- 数据库: database_name

最佳实践:使用 DNS CNAME 或应用配置管理工具实现平滑切换。

7 天后(确认无回退需求且系统稳定):

DMS 资源清理

1. 停止 DMS 复制任务
2. 删除 DMS 复制任务
3. 删除源端和目标端终端节点
4. 删除 DMS 复制实例
5. 删除 DMS 子网组(如不再使用)

网络资源清理

1. 删除跨账号 VPC Peering(如不再需要)
2. 删除 Transit Gateway 附件(如不再需要)
3. 清理安全组规则中的 DMS 相关规则
4. 删除 IAM 跨账号角色(如不再需要)

数据库清理

1. 删除源端 DMS 用户
2. 删除源库的临时配置(如延长的 binlog 保留时间)
3. 归档源库快照(保留至少 30 天用于合规)

费用优化

1. 调整目标库实例规格(如初期配置偏高)
2. 优化 IOPS 配置
3. 启用自动暂停(如使用 Aurora Serverless)
4. 设置备份保留期限
数据完整性验证:
- 表行数对比
- 数据抽样验证
- 关键业务数据验证
- 时间戳字段验证
对象完整性验证:
- 存储过程数量和内容
- 触发器数量和内容
- 函数数量和内容
- 事件调度器状态
- 视图数量和定义
- 索引数量和定义
- 外键约束
性能验证:
- 慢查询日志对比
- 关键查询执行计划
- 数据库连接池配置
- 缓存命中率
应用验证:
- 核心功能测试
- 批处理任务执行
- 定时任务调度
- 日志错误检查

DDL 操作

  • CDC 期间执行的 DDL(如 ALTER TABLE)需手动在目标库重放
  • 建议在迁移期间暂停 DDL 变更

大事务

  • 单个事务 > 10 GB 可能导致任务失败
  • 建议拆分大批量操作

字符集

  • 源端和目标端必须使用相同字符集(推荐 utf8mb4)
风险项影响缓解措施
DMS 任务中断迁移延长启用 Multi-AZ 复制实例 + 检查点恢复
网络抖动CDC 延迟增加使用 DX 或 Transit Gateway
源库 binlog 耗尽CDC 失败Binlog 保留时间设为 48 小时
目标库性能不足写入瓶颈预先调整 IOPS 和实例规格

强烈建议:在非生产环境完整执行一次迁移,验证:

  • 流程正确性
  • 时间估算准确性
  • 应用兼容性
  • 回退方案可行性

配置以下 CloudWatch 告警:

CDCLatencySource > 30 秒: 警告
CDCLatencySource > 60 秒: 严重
FreeStorageSpace < 20%: 警告
MemoryFreeable < 20%: 警告

Q1: Multi-AZ Cluster 为什么不能用快照共享?

A: AWS 产品限制,Multi-AZ Cluster 的快照仅支持同账号恢复。跨账号迁移必须使用逻辑复制方案(DMS、binlog 复制等)。

Q2: Multi-AZ Cluster 可以迁移到非集群实例吗?

A: 可以。DMS 执行逻辑复制,不关心底层架构。Multi-AZ Cluster → 非集群实例是完全支持的迁移路径。性能差异主要体现在故障转移时间(1秒 vs 60秒)。

Q3: 迁移过程中可以修改源库数据吗?

A: 可以。CDC 模式会捕获所有变更并复制到目标库,但需确保 DMS 任务状态为 Replication ongoing

Q4: 如何处理迁移失败?

A: 检查 DMS 任务日志(CloudWatch Logs),常见原因:

  • 网络连接中断:检查安全组和路由
  • 权限不足:验证 DMS 用户权限
  • 目标库磁盘满:扩展存储空间
  • Binlog 耗尽:增加 binlog 保留时间

Q5: SSL 加密会影响性能吗?

A: 影响约 5-10%,但考虑到跨账号数据传输的安全合规性,强烈推荐启用

Q6: RDS 授权 mysql 数据库失败怎么办?

A: RDS 限制对 mysql 系统库的直接授权,这是正常的。DMS 会通过 AWS 内部机制获取必要权限,已授予的其他权限足够完成迁移。