注册
MYSQL迁移到达梦实操经验分享
专栏/技术分享/ 文章详情 /

MYSQL迁移到达梦实操经验分享

DM_340405 2026/08/21 360 0 0
摘要

针对国产化改造项目中,业务系统数据库从 MySQL 迁移到达梦的场景,本例构建了MySQL8.0的单机示例数据,并详细记录了从MySQL8.0迁移到DM8的实操过程和本次测试用例中MYSQL和DM典型差异的对比,以供参考。

一、源端 MySQL 信息(业务示例库 db_user)

1.基础环境

  • 数据库版本:MySQL 8.0
  • 实例架构:单机 InnoDB 引擎
  • 业务库名:db_user(对应达梦单个 Schema)
  • 字符集:utf8mb4
  • 隔离级别:默认 RR(可重复读)
  • 自增主键:表使用AUTO_INCREMENT自增
  • 特殊特性:使用反引号 ` 标识符、LIMIT 分页、IFNULL/DATE_FORMAT/GROUP_CONCAT 函数、DATETIME 时间类型、行级触发器、空字符串业务区分逻辑
    2.源端迁移风险点梳理
  • 业务大量区分空字符串 ‘’ 与 NULL;
  • SQL 全部使用反引号`包裹字段 / 表名;
  • 分页统一使用LIMIT offset,count;
  • 内置函数依赖 MySQL 专属:IFNULL、DATE_FORMAT、GROUP_CONCAT、NOW ();
  • 时间字段使用 DATETIME 存储年月日时分秒;
  • 触发器依赖DELIMITER分隔符、SET NEW.xx赋值语法;
  • 整数包含 TINYINT (1) 布尔标识、无 MEDIUMINT

二、目标端达梦 DM8 信息(COMPATIBLE_MODE=4 MySQL 兼容模式)

1.基础环境配置

  • 数据库版本:DM8
  • 兼容模式参数:COMPATIBLE_MODE=4(全局参数,重启实例生效)
  • 模式规划:创建用户db_user,自动生成同名 Schema DB_USER,对应 MySQL db_user库
  • 字符集:UTF-8(与源端对齐)
  • 事务配置:调整客户端自动提交、隔离级别改为 RR,与 MySQL 对齐
  • 数据类型映射规则(DTS 自动适配)

三、达梦 DTS 迁移完整实施步骤

1.迁移评估:
image.png
根据评估执行结果,将触发器以及高风险迁移对象存储过程单独迁移,便于观察MYSQL和达梦在触发器和存储过程中的典型差异。

2.新建迁移工程,配置源端 MySQL 连接
image.png
image.png
3.配置目标端 DM8 连接,选择迁移源库(MySQL db_user 业务库)
image.png
4.选择待迁移业务对象(触发器、存储过程除外)
image.png
5.迁移结果,迁移成功
image.png
6.触发器和存储过程分别执行迁移
image.png
image.png
迁移结果均显示执行成功
7.达梦端验证触发器是否可用
触发器TRIGGER trg_user_before_insert验证
image.png
image.png
主表t_user_main写入数据,触发日志表t_user_log记录新增用户ID与操作时间,触发器验证可用
8.达梦端验证存储过程是否可用
image.png
验证结果显示存储过程虽然迁移成功了,但实际在达梦中不能用
**解决方法:**改为手动迁移
原 MySQL 逻辑:遍历指定库所有表,动态 count 每张表行数,写入辅助表MYSQL_TABLES
关键点差异:

  • MySQL 用户变量@xxx达梦不支持,替换为局部变量;
  • 游标、Handler 异常捕获语法改写为 DM PL/SQL;
  • information_schema.TABLES → DM 系统视图ALL_TABLES
  • 去掉DELIMITER分隔符;
  • 动态 SQL 使用EXECUTE IMMEDIATE,不能使用PREPARE/EXECUTEMySQL 风格;
  • 达梦 Schema 对象默认大写,入参做UPPER()转换。

手动迁移成功,存储过程可成功统计表的数据量记录到辅助表中。

四、本测试用例中MySQL与DM典型差异对比

  1. 空字符串 ‘’ 与 NULL 区分
  • MySQL:空字符串’’、NULL是两个独立值,WHERE nick_name = ''仅匹配空串,IS NULL仅匹配空值;
  • 达梦原生模式(COMPATIBLE_MODE≠4):Oracle 风格,空字符串等价 NULL,两条数据都会被IS NULL匹配;
  • 达梦COMPATIBLE_MODE=4:完全对齐 MySQL 逻辑,无需修改业务 SQL。
  1. MySQL 反引号 ` 标识符语法报错
  • MySQL 使用反引号`包裹表 / 字段名;
  • 达梦原生使用双引号"区分大小写标识符,无兼容模式时直接识别反引号为语法错误;
  • COMPATIBLE_MODE=4自动兼容反引号语法。
  1. LIMIT 分页语法兼容问题
  • MySQL 标准分页:LIMIT offset, count;
  • 达梦原生无 LIMIT 语法,需嵌套ROWNUM实现分页;COMPATIBLE_MODE=4原生支持 LIMIT。
  1. DATETIME 映射 DATE 丢失时分秒
  • MySQL:DATETIME完整存储年月日 + 时分秒;
  • 达梦:DATE仅存储日期,时分秒自动清零;带时间的数据必须映射TIMESTAMP。
  1. 触发器
    本次触发器可以成功迁移到达梦中,但因为MySQL 触发器语法为自研风格,达梦采用 Oracle PL/SQL 触发器语法,后续碰到复杂触发器,核心语法仍需人工改写。
  2. 存储过程
  • MySQL:自研 SQL/PSM 语法,依赖DELIMITER修改语句结束符,无CREATE OR REPLACE,变量用DECLARE、SET赋值,动态 SQL 用PREPARE,会话变量@xxx;
  • 达梦 DM8:PL/SQL 语法(对标 Oracle),无需分隔符,支持覆盖创建,变量在 AS 块声明、:=赋值,动态 SQL 用EXECUTE IMMEDIATE,无会话变量;
  • 关键:DTS 迁移成功后存储过程无法直接执行,必须人工逐行改写。

五、实操总结

1.达梦COMPATIBLE_MODE=4是降低迁移工作量的核心手段,可解决绝大多数业务 DML 语法问题,但针对触发器、存储过程,在迁移过程中仍需人工进行验证和改写;
DTS 工具仅做结构与数据迁移,数据库可编程对象(触发器、存储过程)无法自动兼容,需预留充足人工改造时间。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服