低停机迁移实战:用华为云 DRS 把 MySQL 平滑迁到 GaussDB(for MySQL)
【摘要】 摘要:数据库迁移是企业上云里风险最高的一环——“迁坏了赔数据,迁慢了业务停摆”。本文以电商订单库从自建 MySQL 迁移到 GaussDB(for MySQL) 为场景,基于数据复制服务 DRS 走“全量+增量”链路,完整演示迁移前评估、预检查、割接窗口、一致性校验与回滚预案,把一次生产级迁移拆成可执行、可撤回的标准动作。标签建议:数据复制服务 DRS、云数据库 GaussDB、数据库迁移、...
摘要:数据库迁移是企业上云里风险最高的一环——“迁坏了赔数据,迁慢了业务停摆”。本文以电商订单库从自建 MySQL 迁移到 GaussDB(for MySQL) 为场景,基于数据复制服务 DRS 走“全量+增量”链路,完整演示迁移前评估、预检查、割接窗口、一致性校验与回滚预案,把一次生产级迁移拆成可执行、可撤回的标准动作。
标签建议:数据复制服务 DRS、云数据库 GaussDB、数据库迁移、云端实践
一、背景与痛点
订单库跑在自建 MySQL 5.7 上,单机主从,数据量约 800GB。业务增长后几个问题越来越疼:
- 扩容靠停写:加只读节点要扩存储、迁数据,窗口按小时算
- 高可用靠人盯:主库宕机靠 MHA 切,切错一次就是事故
- 备份恢复慢:全量备份还原要 40 分钟以上,RTO 不达标
- 峰值顶不住:大促订单写入抖,主从延迟飙升
选型目标很清楚: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 = FULLlog_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 启动与监控
任务启动后分两阶段:
- 全量迁移:DRS 并发读源库表数据写入目标。全量阶段对源库有读压力,建议在低峰启动
- 增量迁移:全量完成后自动切入 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 回滚预案
切库后若发现目标端异常:
- 应用连接串切回源库(源库在观察期内保持数据最新需反向同步,或接受观察期内源库只读、仅兜底查询)
- 若需数据回写源库:提前建一条反向 DRS 任务(目标→源增量),割接窗口内保留
- 回滚决策时限:割接后 30 分钟内必须定,超过则进入修复模式而非回滚模式
经验:没有反向同步链的“回滚”只是嘴上说说。核心业务割接前一定要建反向增量通道。
六、迁移后验证清单
|
验证维度
|
方法
|
通过标准
|
|---|---|---|
|
数据一致性
|
DRS 数据对比 + 关键表行数核对
|
行数一致、抽样字段一致
|
|
功能回归
|
核心链路冒烟测试
|
下单/支付/退款全通
|
|
性能基线
|
同压测模型对比迁移前后
|
P99 延迟不劣化
|
|
高可用
|
手动 kill 主节点
|
自动切换、RTO < 60s
|
|
备份恢复
|
触发一次时间点恢复演练
|
可恢复到指定时刻
|
|
只读扩展
|
挂只读节点跑报表查询
|
主库写入不受读压力影响
|
七、生产避坑清单
❌ 常见翻车点
- 预检查黄色项直接忽略:上线后发现某个存储过程没迁,业务半夜报错
- 无主键大表强行迁:全量阶段表级锁,业务写入阻塞几十分钟
- binlog 保留时间太短:全量跑太久,增量位点被清理,任务中断重来
- 割接前没做应用连接串梳理:硬编码 IP 散在 5 个服务里,切一半漏一半
- 切完立刻结束 DRS 任务:发现数据问题想回查都没了
- 只读节点没预热:切库后报表查询全打主库,主库被打满
- 把“MySQL 兼容”理解成“完全等价”:个别函数行为、索引名约束、隔离级别细节差异,不回归必踩
- 源库迁移期间改表结构:DDL 会让增量解析错位,任务直接异常
✅ 正确姿势
- 预检查零红色 + 黄色逐项签字确认
- 大表提前补主键或拆分区
- binlog 保留设到 72 小时以上
- 连接串统一走配置中心+域名
- DRS 任务观察期后再结束(建议 48h)
- 割接前建反向同步链
- 迁移期间冻结源库 DDL(走变更窗口审批)
- 先在测试环境完整演练一遍再进生产
八、成本与收益复盘
直接收益(订单库场景实测口径,非厂商宣传):
- 只读扩展:新增只读节点不再拷贝数据,扩展时间与数据量解耦
- 高可用:3AZ 部署,RPO=0,主节点故障自动切换
- 备份:物理备份+时间点恢复开箱即用,不再自写 xtrabackup 脚本
- 运维:主备切换、参数调优、慢查询诊断收进控制台
隐性收益:
- 存储随业务自动弹性,告别“每季度扩盘停机”
- 审计日志、SQL 拦截、账号权限模型统一到云控制台
- 后续接 DAS、AOM 做全栈可观测,不用再拼自研监控
成本项要算清:
- 计算节点按规格计费,只读节点越多越贵
- DL6 比 DL5 单位成本高,核心库才值
- DRS 迁移实例按运行时间计费,迁完及时释放
九、总结与扩展
数据库迁移的本质不是“把数据搬过去”,而是把业务连续性风险搬过去。
这次实践的三条核心经验:
- 评估先于执行:UGO 扫一遍比拍脑袋定方案值钱十倍
- 低停机靠增量不在靠运气:DRS 解决技术问题,割接 SOP 解决人的问题
- 回滚是设计出来的:没有反向同步链和观察期,就没有真正的回滚能力
后续可继续深化:
- 异构迁移:Oracle → GaussDB 分布式版,走 UGO + DRS 双工具链
- 多活架构:两地三中心,DRS 双向同步做单元化
- 数据校验常态化:接数据对比定时任务,长期监控源靶一致
- 灰度切流:按用户分片逐步切库,而非一把梭切全量
- 合规加固:TDE 加密、列级脱敏、SQL 审计接入 LTS
本文为原创迁移实践,基于华为云 DRS 与 GaussDB(for MySQL) 整理,操作步骤以当前控制台页面为准。生产割接前请在测试环境完整演练,并准备回滚预案。转载请注明出处。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)