MySQL 迁移 GaussDB 实战:DRS 在线迁移与手动离线迁移全攻略
1. 背景随着国产数据库的普及越来越多的企业将业务从 MySQL 迁移到华为云 GaussDB。迁移过程中如何保证数据一致性、缩短停机时间、处理语法兼容性是每个 DBA 和开发人员必须面对的问题。本文将介绍两种主流的迁移方案方案一使用华为云数据复制服务DRS进行在线迁移支持全量 增量同步停机时间最短适合生产环境。方案二手动离线迁移采用「M 兼容模式建库 mysqldump 导出结构/数据 gsql 导入」方案适合无 DRS 环境或小数据量场景。2. 方案一使用 DRS 在线迁移推荐生产环境首选2.1 适用场景华为云环境源库与目标库网络互通。要求低停机时间业务连续性要求高。希望自动处理部分语法转换减少人工干预。2.2 操作步骤第一步创建 GaussDB 实例在华为云控制台创建 GaussDB 实例确保与源 MySQL 网络互通VPC / 安全组配置。第二步创建 DRS 任务登录 DRS 控制台创建实时同步任务。源库选择 MySQL填写 IP、端口、账号密码。目标库选择 GaussDB填写实例 ID、账号密码。迁移类型选择「全量 增量」。第三步预检查与启动执行预检查修复报错项后启动任务。第四步业务割接等待 DRS 状态变为「增量同步」。停止源库写入业务。确认 DRS 无延迟后结束 DRS 任务。修改应用连接地址指向 GaussDB。3. 方案二手动离线迁移无 DRS 或小数据量3.1 关键前提GaussDB 必须创建为M 兼容模式DBCOMPATIBILITYM以最大程度兼容 MySQL 语法如自增主键、反引号等。3.2 目标库准备在 GaussDB 中创建兼容 MySQL 的数据库-- 创建M兼容模式的数据库CREATEDATABASEtarget_db DBCOMPATIBILITYM;3.3 导出源库结构Schema使用mysqldump仅导出表结构去除触发器和 GTID 信息避免兼容性问题。# 导出结构到 schema.sqlmysqldump-hMYSQL_IP-uUSER-p\--no-data\--skip-triggers\--set-gtid-purgedOFF\--skip-quote-names\source_dbschema.sql命令参数逐行解析参数含义-h MYSQL_IP指定源 MySQL 数据库的主机 IP 地址-u USER指定连接数据库的用户名-p提示输入密码交互式输入避免密码出现在命令行历史中--no-data只导出表结构DDL不导出表中的数据--skip-triggers跳过触发器避免 GaussDB 不兼容的触发器语法--set-gtid-purgedOFF不生成 GTID 相关的SET GLOBAL.GTID_PURGED语句避免导入时报错--skip-quote-names不使用反引号包裹表名和字段名因为 GaussDB 不识别反引号source_db要导出的源数据库名称 schema.sql将导出结果重定向写入schema.sql文件为什么这样配置--no-data这一步只迁移表结构数据在后续步骤单独处理避免结构文件过大、导入超时。--skip-triggersGaussDB 对 MySQL 触发器语法支持有限跳过可减少兼容性问题。--set-gtid-purgedOFFGTID 是 MySQL 主从复制的特性GaussDB 不识别必须关闭。--skip-quote-namesMySQL 默认用反引号包裹标识符而 GaussDB M 模式虽兼容反引号但去掉后能减少不必要的转义问题。注意若遇到索引名冲突或特殊字符可能需要手动编辑schema.sql。GaussDB M 模式下索引名在 Schema 内唯一而非表内唯一。3.4 导入结构到 GaussDB使用gsql客户端导入结构文件。# 导入结构gsql-hGAUSSDB_IP-pPORT-UUSER-WPASSWORD-dtarget_db-fschema.sql3.5 导出数据并导入为避免大事务超时建议按表导出数据和导入。导出所有表数据exportMYSQL_PWDYOUR_PASSWORD# 循环导出每个表的数据为单独SQL文件forTABLEin$(mysql-uUSER-hMYSQL_IP-N-eSHOW TABLES FROM source_db);domysqldump-uUSER-hMYSQL_IP\--no-create-info\--skip-triggers\--compact\--complete-insert\--set-gtid-purgedOFF\--skip-quote-names\source_db$TABLE${TABLE}.sqldone导入数据到 GaussDB# 循环导入每个表的数据forFILEin*.sql;doechoImporting$FILE...gsql-hGAUSSDB_IP-pPORT-UUSER-WPASSWORD-dtarget_db-f$FILEdone3.6 手工迁移中容易踩坑的点1. 字符集与排序规则不一致MySQL 默认utf8mb4而 GaussDB 默认UTF8。若源库表使用了utf8mb4_general_ci等排序规则导入 GaussDB 后可能出现中文乱码或排序异常。-- 导出前确认源库字符集SHOWCREATETABLEsource_table;-- 导入前在 GaussDB 中设置客户端编码SETclient_encodingUTF8;2. 外键约束导致导入顺序错误MySQL 导出时默认按表名排序若表之间存在外键依赖直接按字母序导入会因父表未建而报错。# 导出时禁用外键检查在 schema.sql 开头添加SET session_replication_rolereplica;3. 大字段BLOB/TEXT导入超时gsql默认单条语句超时时间较短导入包含大字段的表时容易中断。# 导入时增加超时时间gsql-hGAUSSDB_IP-pPORT-UUSER-WPASSWORD\-dtarget_db-f$FILE--statement-timeout04. 空字符串与 NULL 的差异MySQL 中和NULL是不同值但 GaussDB 某些场景下会将空字符串转换为NULL导致数据不一致。-- 导入后检查空字符串是否被转换SELECTCOUNT(*)FROMtarget_tableWHEREcolumn_name;5. 分区表语法不兼容MySQL 的分区表语法如PARTITION BY HASH在 GaussDB 中写法不同需手动改写为 GaussDB 的分区语法。6. 视图与存储过程需单独处理mysqldump导出的视图和存储过程在 GaussDB 中可能无法直接执行需逐个检查并改写。# 单独导出视图mysqldump-hMYSQL_IP-uUSER-p\--no-data --skip-triggers --set-gtid-purgedOFF\source_db view_nameview_name.sql7. 导入后索引失效GaussDB 导入数据后部分索引可能未自动重建需手动执行ANALYZE更新统计信息。-- 更新统计信息ANALYZEtarget_table;4. 常见兼容性修正与注意事项4.1 自增主键M 模式下支持AUTO_INCREMENT但插入数据时若指定 ID 值需注意序列同步。若手动插入数据后需重置序列-- 示例重置表 test_table 的 id 序列SELECTsetval(test_table_id_seq,(SELECTMAX(id)FROMtest_table));4.2 数据类型差异MySQLTINYINT(1)通常映射为 GaussDBBOOLEAN或SMALLINT需检查业务逻辑。MySQLDATETIME默认值0000-00-00 00:00:00在 GaussDB M 模式中不支持需改为NULL或合法时间。MySQLENUM/SET类型在 GaussDB 中支持有限建议转换为VARCHAR或字典表。4.3 保留字冲突GaussDB 有更多保留字如order、user若表名或字段名为保留字需用双引号包裹如user。4.4 JSON 类型GaussDB M 模式对 JSON 支持有所限制复杂 JSON 操作可能需调整为JSONB或文本处理。4.5 大小写敏感GaussDB 默认标识符小写若 MySQL 表名大写需在 SQL 中使用双引号或统一转换为小写。5. 数据校验迁移完成后对比源库和目标库的记录数及关键字段哈希值。-- 在GaussDB中执行SELECTCOUNT(*)FROMtarget_table;-- 在MySQL中执行SELECTCOUNT(*)FROMsource_table;6. 总结对比项DRS 在线迁移手动离线迁移停机时间最短增量同步较长需停写导出导入操作复杂度低控制台可视化高需脚本处理语法转换自动处理部分转换需手动修正兼容性适用场景生产环境、大数据量无 DRS 环境、小数据量选择哪种方案取决于您的业务场景和对停机时间的容忍度。生产环境强烈推荐使用 DRS 在线迁移若条件受限手动离线迁移配合 M 兼容模式也能顺利完成迁移任务。

相关新闻

DC-Pi:PLC、HMI与AI在实时Linux内核中的深度融合

DC-Pi:PLC、HMI与AI在实时Linux内核中的深度融合

1. 这不是“加个AI模块”那么简单:DC-Pi的融合逻辑到底在解决什么真问题?工业控制现场,我见过太多“AI”的PPT项目——在PLC柜子旁边加一台工控机跑TensorFlow,用USB线连着HMI屏做“智能告警”,最后发现模型推理延迟比…

2026/9/25 20:45:49 阅读更多 →
MFC 界面老旧怎么升级?BCGControlBar Pro 适配 Visual Studio 2026 主题教程

MFC 界面老旧怎么升级?BCGControlBar Pro 适配 Visual Studio 2026 主题教程

一套运行多年的CAD、测量检测或设备调试软件,核心算法和业务流程仍然稳定,但工具栏、停靠窗口、标签页和属性网格看起来却像来自不同年代。开发团队即使已经换用新的Visual Studio编译环境,也会发现:开发工具升级了,软…

2026/9/25 20:45:49 阅读更多 →
飞书项目主数据同步插件实战:一处维护枚举,自动同步到多个空间

飞书项目主数据同步插件实战:一处维护枚举,自动同步到多个空间

企业用飞书项目做多空间协作时,常踩一个隐蔽的坑:下拉字段口径对不齐。项目类型、优先级、客户行业、合同状态……这些枚举一旦要跨空间统计,各有一套版本就全乱了。飞书项目主数据同步插件由北京高远科技开发、作为飞书项目插件运行&#xf…

2026/9/25 20:44:49 阅读更多 →

最新新闻

为什么不用整帧全局 FV,而使用 Paxel 分块统计

为什么不用整帧全局 FV,而使用 Paxel 分块统计

1. 获取空间位置信息:区分画面不同区域清晰度全局 FV 只输出 1 个数值,代表整幅画面纹理能量总和,丢失空间信息。 典型问题:背景强纹理(树叶、草丛)会淹没主体,导致 AF 把焦点锁到背景。 Paxel …

2026/9/25 21:28:13 阅读更多 →
严蔚敏《数据结构(C语言版)习题集》全答案PDF:筛选、编译与避坑指南

严蔚敏《数据结构(C语言版)习题集》全答案PDF:筛选、编译与避坑指南

简介:严蔚敏《数据结构(C语言版)习题集》全答案PDF是面向计算机专业学生及自学者的经典配套资源,覆盖绪论、线性表、栈、队列、串、树、图等核心章节,每道习题均提供可运行的C语言解法与思路分析,适合课后练…

2026/9/25 21:28:13 阅读更多 →
OpenLess流式插入原理:逐字上屏如何把等待降到0,剪贴板回退兜底又是怎么实现的

OpenLess流式插入原理:逐字上屏如何把等待降到0,剪贴板回退兜底又是怎么实现的

OpenLess流式插入原理:逐字上屏如何把等待降到0,剪贴板回退兜底又是怎么实现的 【免费下载链接】openless Hold a key, speak, release — AI-polished text appears at your cursor in any app. Open-source voice input for macOS & Windows. (按住…

2026/9/25 21:28:13 阅读更多 →
他们已经在用了:六个岗位眼中

他们已经在用了:六个岗位眼中

用户声音数智安全问数平台 用户证言 | 证言为场景演绎,截图为演示环境数据同一个问数平台,不同岗位的人看到的是不同的价值。运营看到的是“快”,财务看到的是“准”,数据工程师看到的是“省心”。这篇我们把六个岗位…

2026/9/25 21:28:13 阅读更多 →
【研发篇01】基于SVR的软件研发效能评估

【研发篇01】基于SVR的软件研发效能评估

目录 一、为什么软件研发效能评估适合用 SVR? 二、场景设定:5 个研发团队 / 5 个软件项目 三、为什么这里用手写 SVR,而不用 fitrsvm? 四、核心代码解析(节选) 1)RBF 核:把非线…

2026/9/25 21:28:13 阅读更多 →
都是语音播报,MP3 和 TTS 怎么选?你的温度/价格播报项目,可能MP3就够用了

都是语音播报,MP3 和 TTS 怎么选?你的温度/价格播报项目,可能MP3就够用了

做单片机的朋友,大概率都纠结过一件事:给项目加个语音播报功能,是买MP3模块,还是用TTS语音合成?先说一个可能有点反直觉的结论:温度播报,价格播报,这一类听着像“动态内容”需求的播…

2026/9/25 21:27:13 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →