低停机迁移实战:用华为云 DRS 把 MySQL 平滑迁到 GaussDB(for MySQL)

举报
yd_280727371 发表于 2026/10/31 22:51:01 2026/10/31
【摘要】 摘要:数据库迁移是企业上云里风险最高的一环——“迁坏了赔数据,迁慢了业务停摆”。本文以电商订单库从自建 MySQL 迁移到 GaussDB(for MySQL) 为场景,基于数据复制服务 DRS 走“全量+增量”链路,完整演示迁移前评估、预检查、割接窗口、一致性校验与回滚预案,把一次生产级迁移拆成可执行、可撤回的标准动作。标签建议:数据复制服务 DRS、云数据库 GaussDB、数据库迁移、...
摘要:数据库迁移是企业上云里风险最高的一环——“迁坏了赔数据,迁慢了业务停摆”。本文以电商订单库从自建 MySQL 迁移到 GaussDB(for MySQL) 为场景,基于数据复制服务 DRS 走“全量+增量”链路,完整演示迁移前评估、预检查、割接窗口、一致性校验与回滚预案,把一次生产级迁移拆成可执行、可撤回的标准动作。
标签建议:数据复制服务 DRS、云数据库 GaussDB、数据库迁移、云端实践

一、背景与痛点

订单库跑在自建 MySQL 5.7 上,单机主从,数据量约 800GB。业务增长后几个问题越来越疼:
  1. 扩容靠停写:加只读节点要扩存储、迁数据,窗口按小时算
  2. 高可用靠人盯:主库宕机靠 MHA 切,切错一次就是事故
  3. 备份恢复慢:全量备份还原要 40 分钟以上,RTO 不达标
  4. 峰值顶不住:大促订单写入抖,主从延迟飙升
选型目标很清楚:MySQL 生态不推翻、业务改动尽量小、迁移过程不停机。
GaussDB(for MySQL) 走存算分离架构,兼容 MySQL 协议,只读节点扩展与数据量解耦——方向对,但“兼容”不等于“零改造”,迁移能不能成,看的是前置评估和割接纪律,不是产品宣传语。

二、方案选型

2.1 为什么用 DRS 而不是手工导


方式
停机时间
适用场景
风险
mysqldump 导出导入
小时级
小库、可停业务
数据不一致、耗时不可控
主从搭建+切主
分钟级
DBA 熟练、同构迁移
配置复杂、回滚难
DRS 全量+增量​
秒级停写窗口​
生产业务迁移
预检查不通过需返工
DRS 的核心是“先全量搬存量,再追 binlog 增量”,源库全程对外服务,只在最后切连接时短暂停写。

2.2 目标实例规划

GaussDB(for MySQL) 有两种存储类型,选型直接决定成本和性能:
  • DL6:3AZ 部署、RPO=0、峰值吞吐更高,适合金融/电商核心交易
  • DL5:同为 3AZ、RPO=0,单位容量成本更低,适合次核心业务
订单库是核心交易链路,选 DL6 + 独享型计算节点 + 3 只读节点。
注意:存储类型创建后不能直接切换,选错只能新建实例重迁——这一步要在规划阶段定死。

2.3 迁移架构

自建 MySQL 5.7(主)
   │
   │ binlog 增量捕获
   ▼
DRS 迁移实例(全量+增量)
   │
   ▼
GaussDB(for MySQL) 目标实例
   │
   ├─ 结构迁移:表/主键/唯一键
   ├─ 全量迁移:存量数据
   └─ 增量迁移:持续追 binlog
   │
   ▼
割接:应用连接串切到目标库内网地址

三、迁移前评估(最容易被跳过的环节)

这一步不做,割接当晚必出事。

3.1 兼容性盘点

用 GaussDB 配套的 UGO(数据库对象迁移评估)​ 扫一遍源库:
  • 存储过程、触发器、视图语法差异
  • 自增主键行为、数据类型精度
  • JSON 函数、窗口函数覆盖度
  • 特殊字符集、自定义函数
经验法则:纯 CRUD + 标准 DDL 的互联网业务改造量很小;重度依赖存储过程、自定义函数、特殊语法的老系统,先评估再决定走 GaussDB(for MySQL) 还是分布式 GaussDB。

3.2 源库前置检查清单

DRS 对源库有明确权限和配置要求:
账号权限:
  • 全量迁移:SELECT、SHOW VIEW、EVENT
  • 全量+增量:SELECT、SHOW VIEW、EVENT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT
参数与状态:
  • binlog_format = ROW(必须是行模式)
  • binlog_row_image = FULL
  • log_bin 已开启,且保留时间 ≥ 迁移窗口预估时长
  • 所有迁移表有主键或唯一键(无主键表同步会加锁)
  • 字符集统一(避免 utf8 与 utf8mb4 混用)
  • 外键、触发器在同步期间目标端先禁用
数据瘦身:
  • 清理过期日志表、临时表
  • 大表提前做分区,避免单表全量读取阻塞业务

3.3 网络连通

  • 源库在公网:开放 DRS 迁移实例 EIP 到源库白名单
  • 源库在他云 VPC:走对等连接或专线
  • 目标库与业务应用同 VPC,切库后用内网地址
DRS 迁移实例创建后约 5-10 分钟就绪,EIP 要从控制台拿到后反填到源库安全组。

四、DRS 迁移实操

4.1 创建目标实例

GaussDB(for MySQL) 控制台创建:
  • 兼容模式:MySQL 兼容
  • 版本:与源库对齐(5.7 业务选 5.7 兼容档)
  • 存储:DL6
  • 计算:独享型 8U32G 起步
  • 只读节点:先建 1 个,割接后按需扩
  • 参数模板:继承源库关键参数(sql_mode、lower_case_table_names 必须一致)

4.2 创建 DRS 迁移任务

进入 DRS 控制台 → 创建迁移任务:
基本信息:
  • 数据流向:入云
  • 源库引擎:MySQL
  • 目标库引擎:GaussDB(for MySQL)
源库配置:
  • 连接方式是公网/VPN/专线按网络环境选
  • 填源库 IP、端口、账号、密码
  • 测试连接必须通过
目标库配置:
  • 选刚创建的 GaussDB(for MySQL) 实例
  • 测试连接通过
迁移对象:
  • 迁移用户:否(账号单独建,避免权限模型差异)
  • 迁移对象:指定库或全库(建议先指定核心库试跑)
迁移类型:选 全量+增量

4.3 预检查与修复

提交后 DRS 自动跑预检查,常见不通过项:

检查项
不通过原因
修复方式
binlog 格式
非 ROW
源库改 binlog_format=ROW 并重启或刷变量
源库权限不足
账号缺 REPLICATION 权限
重新授权
无主键表
存在无主键大表
补主键或确认可接受同步锁
字符集不支持
源库用了罕见字符集
统一转 utf8mb4
目标库对象已存在
同名表残留
清空目标库或换 schema
外键依赖
目标端外键未禁用
先禁外键,割接后开启
纪律:预检查有“不通过”必须修完再启动,黄色“请确认”项要逐条人工确认,不能一键忽略。

4.4 启动与监控

任务启动后分两阶段:
  1. 全量迁移:DRS 并发读源库表数据写入目标。全量阶段对源库有读压力,建议在低峰启动
  2. 增量迁移:全量完成后自动切入 binlog 追平,任务不会自动结束,需人工确认后停
控制台实时看三个指标:
  • 全量进度(已迁移表数/总行数)
  • 增量延迟(秒)——割接前必须归零
  • 同步状态(正常/异常/中断)

五、割接流程(生产级 SOP)

低停机 ≠ 零停机。真正停写的时间只有“切连接”那几秒到几十秒,其余全程业务在线。

5.1 割接前准备(T-7 天)

  • [ ] UGO 兼容评估报告完成,改造项清零或确认可接受
  • [ ] DRS 增量延迟稳定 < 1s 持续 24 小时
  • [ ] 目标库做一次全量回归测试(测试环境指目标库跑核心用例)
  • [ ] 应用连接串改为可热更新配置(配置中心或域名,禁止硬编码 IP)
  • [ ] 回滚预案评审通过:保留源库只读副本 48 小时不销毁
  • [ ] 割接窗口定在低峰(如凌晨 2-4 点),提前通知业务方

5.2 割接当晚执行(T0)

Step 1|停写
  • 应用层进入维护模式,停止新订单写入(入口网关拦写请求,读继续)
  • 等待 DRS 增量延迟归零
Step 2|终检
  • DRS 控制台发起数据级对比(对象对比+行数对比+抽样内容对比)
  • 关键表行数源端与目标端一致
Step 3|切连接
  • 配置中心把数据库 host 从源库切到 GaussDB(for MySQL) 内网地址
  • 应用分批重启或热加载配置
Step 4|验证
  • 跑核心链路冒烟:下单、支付、查询、退款
  • 观察目标库监控:QPS、慢查询、连接数、复制状态
Step 5|观察期
  • 切完后保持 DRS 增量任务不结束,源库保留为只读兜底
  • 观察 24-48 小时无异常,再结束 DRS 任务、下线源库写能力

5.3 回滚预案

切库后若发现目标端异常:
  1. 应用连接串切回源库(源库在观察期内保持数据最新需反向同步,或接受观察期内源库只读、仅兜底查询)
  2. 若需数据回写源库:提前建一条反向 DRS 任务(目标→源增量),割接窗口内保留
  3. 回滚决策时限:割接后 30 分钟内必须定,超过则进入修复模式而非回滚模式
经验:没有反向同步链的“回滚”只是嘴上说说。核心业务割接前一定要建反向增量通道。

六、迁移后验证清单


验证维度
方法
通过标准
数据一致性
DRS 数据对比 + 关键表行数核对
行数一致、抽样字段一致
功能回归
核心链路冒烟测试
下单/支付/退款全通
性能基线
同压测模型对比迁移前后
P99 延迟不劣化
高可用
手动 kill 主节点
自动切换、RTO < 60s
备份恢复
触发一次时间点恢复演练
可恢复到指定时刻
只读扩展
挂只读节点跑报表查询
主库写入不受读压力影响

七、生产避坑清单

❌ 常见翻车点
  1. 预检查黄色项直接忽略:上线后发现某个存储过程没迁,业务半夜报错
  2. 无主键大表强行迁:全量阶段表级锁,业务写入阻塞几十分钟
  3. binlog 保留时间太短:全量跑太久,增量位点被清理,任务中断重来
  4. 割接前没做应用连接串梳理:硬编码 IP 散在 5 个服务里,切一半漏一半
  5. 切完立刻结束 DRS 任务:发现数据问题想回查都没了
  6. 只读节点没预热:切库后报表查询全打主库,主库被打满
  7. 把“MySQL 兼容”理解成“完全等价”:个别函数行为、索引名约束、隔离级别细节差异,不回归必踩
  8. 源库迁移期间改表结构:DDL 会让增量解析错位,任务直接异常
✅ 正确姿势
  • 预检查零红色 + 黄色逐项签字确认
  • 大表提前补主键或拆分区
  • binlog 保留设到 72 小时以上
  • 连接串统一走配置中心+域名
  • DRS 任务观察期后再结束(建议 48h)
  • 割接前建反向同步链
  • 迁移期间冻结源库 DDL(走变更窗口审批)
  • 先在测试环境完整演练一遍再进生产

八、成本与收益复盘

直接收益(订单库场景实测口径,非厂商宣传):
  • 只读扩展:新增只读节点不再拷贝数据,扩展时间与数据量解耦
  • 高可用:3AZ 部署,RPO=0,主节点故障自动切换
  • 备份:物理备份+时间点恢复开箱即用,不再自写 xtrabackup 脚本
  • 运维:主备切换、参数调优、慢查询诊断收进控制台
隐性收益:
  • 存储随业务自动弹性,告别“每季度扩盘停机”
  • 审计日志、SQL 拦截、账号权限模型统一到云控制台
  • 后续接 DAS、AOM 做全栈可观测,不用再拼自研监控
成本项要算清:
  • 计算节点按规格计费,只读节点越多越贵
  • DL6 比 DL5 单位成本高,核心库才值
  • DRS 迁移实例按运行时间计费,迁完及时释放

九、总结与扩展

数据库迁移的本质不是“把数据搬过去”,而是把业务连续性风险搬过去。
这次实践的三条核心经验:
  • 评估先于执行:UGO 扫一遍比拍脑袋定方案值钱十倍
  • 低停机靠增量不在靠运气:DRS 解决技术问题,割接 SOP 解决人的问题
  • 回滚是设计出来的:没有反向同步链和观察期,就没有真正的回滚能力
后续可继续深化:
  1. 异构迁移:Oracle → GaussDB 分布式版,走 UGO + DRS 双工具链
  2. 多活架构:两地三中心,DRS 双向同步做单元化
  3. 数据校验常态化:接数据对比定时任务,长期监控源靶一致
  4. 灰度切流:按用户分片逐步切库,而非一把梭切全量
  5. 合规加固:TDE 加密、列级脱敏、SQL 审计接入 LTS

本文为原创迁移实践,基于华为云 DRS 与 GaussDB(for MySQL) 整理,操作步骤以当前控制台页面为准。生产割接前请在测试环境完整演练,并准备回滚预案。转载请注明出处。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。