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)
- 路由表已正确配置
源端 RDS 配置
Section titled “源端 RDS 配置”- 自动备份已启用(Multi-AZ Cluster 默认启用)
- Binlog 格式为 ROW(默认配置)
- Binlog 保留时间 ≥ 24 小时
IAM 权限
Section titled “IAM 权限”- 源账号:创建跨账号访问 IAM 角色
- 目标账号:DMS 服务角色(
dms-vpc-role、dms-cloudwatch-logs-role)
步骤 1: 评估迁移方案
Section titled “步骤 1: 评估迁移方案”DMS 方案优势
Section titled “DMS 方案优势”为什么选择 DMS:对于 RDS Multi-AZ Cluster,DMS 是推荐方案,原因:
- Multi-AZ Cluster 不支持跨账号快照共享
- CDC(持续数据捕获)将停机时间压缩至业务切换窗口(< 10 分钟)
- 提供数据验证功能,确保迁移一致性
- 原生支持跨账号迁移
步骤 2: 创建目标 RDS 实例
Section titled “步骤 2: 创建目标 RDS 实例”引擎版本: 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实例]
步骤 3: 配置网络连接
Section titled “步骤 3: 配置网络连接”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)[网络配置示意图]
步骤 4: 创建 DMS 复制实例
Section titled “步骤 4: 创建 DMS 复制实例”实例规格选择
Section titled “实例规格选择”决策矩阵:
| 数据库大小 | 日均变更量 | 推荐规格 | 内存 | 说明 |
|---|---|---|---|---|
| < 100 GB | 低 | dms.t3.medium | 4 GB | 开发测试 |
| 100-500 GB | 中等 | dms.c6.xlarge | 8 GB | 生产推荐 |
| > 500 GB | 高 | dms.r6.xlarge | 32 GB | 内存优化 |
关键配置说明:
内存优先于磁盘:DMS 采用流式复制架构,数据在内存中实时处理并转发,本地磁盘仅用于缓存 CDC 事务日志和任务日志。因此:
- 内存大小直接影响迁移性能(数据转换速度、并行处理能力)
- 磁盘空间仅需满足日志缓存需求,无需匹配源数据库大小
存储空间配置:
- 对于 100 GB 源数据库,推荐配置 50-100 GB 存储空间
- 计算公式:
存储空间 = MAX(50 GB, 每小时变更量 × 缓存小时数) - 示例:中等负载(2 GB/小时变更),缓存 12 小时 = 24 GB,配置 50 GB 留余量
实例系列选择:
- C6 系列(计算优化):生产环境标准选择,CPU 和内存均衡
- R6 系列(内存优化):需更快迁移速度或大量并行表时选择
- T3 系列(通用突发):仅适合开发测试环境
性能提升关键:如需加速迁移,应优先选择内存更大的实例(如从 C6 升级到 R6),而非增加磁盘空间。监控 MemoryFreeable 和 SwapUsage 指标,确保剩余内存 > 20% 且无交换空间使用。
VPC: 可访问源端和目标端的 VPC子网组: 私有子网安全组: 允许访问源端和目标端 RDS公开访问: 禁用(最佳实践)Multi-AZ 复制实例:
- 生产环境:启用(避免单点故障)
- 开发测试:可选(降低成本)
[DMS复制实例配置]
步骤 5: 创建 DMS 用户并授权
Section titled “步骤 5: 创建 DMS 用户并授权”源端用户权限
Section titled “源端用户权限”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’” 错误,可忽略,已授予的权限足够
步骤 6: 创建源端终端节点
Section titled “步骤 6: 创建源端终端节点”端点类型: 源端引擎类型: MySQL服务器名称: 源 RDS Multi-AZ Cluster 写入器端点 格式: mydb-cluster.cluster-xxx.region.rds.amazonaws.com端口: 3306用户名: dmsuser密码: [上一步创建的密码]SSL 配置
Section titled “SSL 配置”是否启用 SSL: 推荐启用
原因:
- 跨账号数据传输涉及网络安全合规要求
- 对性能影响约 5-10%,可接受
配置方式:
- 下载 RDS CA 证书
- 在终端节点中上传证书
- SSL 模式选择
require
[源端终端节点配置]
步骤 7: 创建目标端终端节点
Section titled “步骤 7: 创建目标端终端节点”端点类型: 目标引擎类型: MySQL服务器名称: 目标 RDS 实例端点端口: 3306用户名: 具有完整写入权限的用户密码: [目标库密码]Target metadata:
{ "initstmt": "SET FOREIGN_KEY_CHECKS=0;", "ParallelLoadThreads": 4}说明:
initstmt:加速初始加载,迁移完成后会自动恢复ParallelLoadThreads:Multi-AZ Cluster 推荐值为 4
[目标端终端节点配置]
步骤 8: 创建迁移任务
Section titled “步骤 8: 创建迁移任务”推荐选择: “迁移现有数据并复制持续更改”(全量 + 增量)
原因: 包含全量和 CDC,适合生产环境最小化停机。

建议开启迁移前评估,这将有助于评估迁移前的环境以及配置是否符合DMS标准;
- 保持默认即可
- 建议开启在执行数据迁移的情况下验证

步骤 9: 监控迁移进度(可选)
Section titled “步骤 9: 监控迁移进度(可选)”在复制实例的CloudWatch指标页面可以看到常规监控指标;如果需要详细监控,可以使用CloudWatch控制台创建。

关键监控指标
Section titled “关键监控指标”CloudWatch 指标:
| 指标名称 | 正常范围 | 说明 |
|---|---|---|
CDCLatencySource | < 10 秒 | CDC 延迟时间 |
FullLoadThroughputRowsSource | - | 全量加载速率 |
FreeStorageSpace | > 20% | 复制实例可用空间 |
MemoryFreeable | > 20% | 可用内存 |
迁移时间估算
Section titled “迁移时间估算”全量加载阶段:
时间 = 数据量 / (网络带宽 × 利用率 × 压缩比)示例: 500 GB / (1 Gbps × 0.7 × 1.5) ≈ 2 小时CDC 追平阶段:
- 通常 10-30 分钟
- 监控
CDCLatencySource< 10 秒表示已追平
步骤 10: 迁移后清理
Section titled “步骤 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)
手动迁移方式
Section titled “手动迁移方式”步骤 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';二级索引迁移
Section titled “二级索引迁移”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+)
外键约束迁移
Section titled “外键约束迁移”DMS 不会创建外键约束。手动添加:
-- 在源库查看外键SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAMEFROM information_schema.KEY_COLUMN_USAGEWHERE TABLE_SCHEMA = 'database_name' AND REFERENCED_TABLE_NAME IS NOT NULL;
-- 在目标库创建外键ALTER TABLE child_tableADD CONSTRAINT fk_nameFOREIGN KEY (column_name)REFERENCES parent_table(column_name)ON DELETE CASCADEON UPDATE CASCADE;重建 MySQL 用户和权限:
-- 在源库导出用户和权限SELECT CONCAT( 'CREATE USER ''', user, '''@''', host, ''' IDENTIFIED BY ''[PASSWORD]'';') AS create_userFROM mysql.userWHERE user NOT IN ('root', 'mysql.sys', 'mysql.session', 'rdsadmin', 'dmsuser');
-- 导出权限SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS show_grantsFROM mysql.userWHERE 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;参数配置验证
Section titled “参数配置验证”确认目标库参数与源库一致:
-- 对比关键参数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';监控配置迁移
Section titled “监控配置迁移”迁移以下配置到目标库:
CloudWatch 告警规则:
- CPU 利用率告警
- 磁盘空间告警
- 数据库连接数告警
- 复制延迟告警(如有只读副本)
Performance Insights:
- 启用 Performance Insights
- 配置数据保留期限
- 设置性能基线
增强监控:
- 启用增强监控
- 配置监控粒度(建议 60 秒)
应用连接字符串更新
Section titled “应用连接字符串更新”准备连接信息:
源端连接信息(停用): - 端点: 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. 设置备份保留期限迁移后验证检查清单
Section titled “迁移后验证检查清单”数据完整性验证: - 表行数对比 - 数据抽样验证 - 关键业务数据验证 - 时间戳字段验证
对象完整性验证: - 存储过程数量和内容 - 触发器数量和内容 - 函数数量和内容 - 事件调度器状态 - 视图数量和定义 - 索引数量和定义 - 外键约束
性能验证: - 慢查询日志对比 - 关键查询执行计划 - 数据库连接池配置 - 缓存命中率
应用验证: - 核心功能测试 - 批处理任务执行 - 定时任务调度 - 日志错误检查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 内部机制获取必要权限,已授予的其他权限足够完成迁移。