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-role、dms-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 GB低dms.t3.medium4 GB开发测试
100-500 GB中等dms.c6.xlarge8 GB生产推荐
> 500 GB高dms.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),而非增加磁盘空间。监控 MemoryFreeable 和 SwapUsage 指标,确保剩余内存 > 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 内部机制获取必要权限,已授予的其他权限足够完成迁移。