扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

MySQL无缝迁移到达梦:前置方法与全面评估分析指南

01/15 14:10
1525
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言

从 MySQL 迁移到达梦数据库(DM Database)前,进行全面的兼容性分析和评估至关重要。以下是一套系统的评估流程和关键检查项,帮助您量化工作量、识别风险并制定迁移计划:

兼容性评估阶段

对象兼容性分析

对象类型 关键检查项 工具/方法
表结构 - 数据类型兼容性(如 BIGINTBIGINTTEXTCLOB) - 自增列、主键、外键约束 - 默认值、非空约束 达梦官方工具:DTS(数据迁移工具) SQL脚本对比工具:Beyond Compare、Redgate SQL Compare
SQL语法 - DML(SELECT/INSERT/UPDATE/DELETE)兼容性 - 达梦特有语法(如 MERGE INTO) - 函数兼容性(如 GROUP_CONCATLISTAGG 达梦SQL兼容模式:SET COMPATIBLE_MODE=4(兼容MySQL) 静态代码扫描工具:SquidDM SQL Checker
存储过程/函数 - 流程控制语句(如 DECLARE HANDLEREXCEPTION) - 变量类型兼容性(如 VARCHARVARCHAR2) - 异常处理机制 达梦调试工具:DM PL/SQL Debugger 手动逐段验证 + 日志记录
视图/触发器 - 视图引用的表或函数是否兼容 - 触发器事件类型(如 BEFORE INSERTBEFORE ROW 达梦管理工具:DM Manager 自动化脚本生成工具:DM SQL Translator
索引/分区 - 索引类型(如全文索引需改写为达梦语法) - 分区策略兼容性(RANGE/HASH vs LIST) 达梦性能分析工具:DM Performance Analyzer 执行计划对比:EXPLAIN PLAN

数据库特性对比

特性 MySQL 达梦DM8 适配策略
事务隔离级别 默认REPEATABLE READ 默认READ COMMITTED 需评估业务逻辑是否依赖隔离级别,必要时调整参数 ISOLATION_LEVEL
字符集/排序规则 utf8mb4 / utf8mb4_general_ci UTF-8 / UTF8_UNICASE_CI 迁移时需显式指定字符集,避免乱码
日期函数 NOW()SYSDATE CURRENT_TIMESTAMP 语法适配工具自动替换或手动调整
分页查询 LIMIT offset, count SELECT TOP n START WITH m 统一改为标准SQL语法:ROW_NUMBER() OVER() + 子查询
JSON支持 原生JSON类型+函数 通过VARCHAR + JSON扩展包支持 需评估JSON操作复杂度,必要时引入达梦JSON扩展包

迁移工作量估算

适配工作量分级

等级 描述 示例场景
完全兼容,无需修改(如基础表结构) 简单表迁移(无特殊约束、无复杂索引)
需少量语法调整或配置(如函数改写、SQL模式设置) GROUP_CONCATLISTAGGAUTO_INCREMENTIDENTITY
需重写代码或重构逻辑(如存储过程、触发器) 存储过程中依赖MySQL特有语法(如DECLARE CONTINUE HANDLER
阻断 不兼容且无替代方案(需业务逻辑改造) 依赖MySQL特有存储引擎(如MyISAM)、使用GEOMETRY类型且无空间数据扩展包

工作量评估表

参考值,不一定准确

对象类型 对象数量 低(%) 中(%) 高(%) 阻断项 预计人天
表结构 200 90% 8% 2% 0 3
存储过程 50 10% 40% 40% 10% 15
SQL查询 1000 70% 25% 5% 0 10
总计 - - - - - 28人天

迁移实施策略

分阶段迁移

  1. 试点迁移 • 选择核心模块(如用户管理)进行验证,覆盖典型场景(事务、复杂查询)。 • 验证工具链:达梦DTS + 自定义校验脚本。
  2. 灰度切换 • 使用dmdrs软件实时同步从MySQL数据同步达梦,折机切换。
  3. 全量切换 • 停机窗口内完成最终数据同步,启用达梦高可用方案。

数据迁移工具

MySQL Schema → DM Schema:达梦DTS自动转换              │              ├─ 不兼容对象 → 人工干预(脚本改写)              │              └─ 数据迁移 → 并行加载 + 一致性校验(CRC32/MD5)

性能调优

参数调整

SQL优化


风险与应对措施

风险类型 应对方案
数据不一致 迁移前后使用DBMS_COMPARISON校验,异常时回切到MySQL备份
性能下降 启用达梦SQL性能监控(DM Report),针对性优化索引或改写SQL
兼容性阻断项 评估替代方案(如用Java实现原存储过程逻辑),或保留MySQL作为子系统

环境准备

学习本章节前请预先安装MySQL数据库,并下载官方提供的示例数据库文件。并将该数据库导入到mysql数据库中,之后利用达梦数据迁移工具进行深入分析。

MySQL 官方示例数据库如何下载

MySQL 提供了一些非常好的用来演示 MySQL 各项功能的示例数据库,同 Oracle 也提供了示例数据库。但是很少有人知道 MySQL 也提供,或许是因为它没有像 Oracle 一样在安装的时候提供用户安装。

下载说明

访问mysql官方地址:https://www.mysql.com,点Documentation,然后选择more,如下图参考信息

点more后信息如下:

这里我们选择9.2的版本,同时下载sakila database(复杂,涉及到储存过程、函数、视图等)比较复杂的场景

访问地址:https://dev.mysql.com/doc/index-other.html

修改mysql用户登录权限

mysql> SELECT host, user FROM mysql.user WHERE user = 'root';+-----------+------+| host      | user |+-----------+------+| localhost | root |+-----------+------+1 row in set (0.38 sec)mysql> UPDATE mysql.user SET host='%' WHERE user='root';Query OK, 1 row affected (0.11 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> SELECT host, user FROM mysql.user WHERE user = 'root';+------+------+| host | user |+------+------+| %    | root |+------+------+1 row in set (0.00 sec)mysql> 

将数据导入到mysql

文件下载后并解压,信息如下

下载完成之后解压完显示如上图三个文件,这里拿 sakila 作为示例:

  • sakila.mwb:workbench 数据模型;
  • sakila-data.sql:表记录信息;
  • sakila-schema.sql:表结构信息。

将文件上传到服务执行,也可以使用图形化工具创建。

[root@dmkafka mysql]# chown mysql:mysql -R sakila-db/[root@dmkafka mysql]# ls -l sakila-db/总用量 3340-rw-r--r-- 1 mysql mysql 3351749  3月  1 07:07 sakila-data.sql-rw-r--r-- 1 mysql mysql   40093  3月  1 07:07 sakila.mwb-rw-r--r-- 1 mysql mysql   24269  3月  1 07:07 sakila-schema.sql[root@dmkafka mysql]# 

从控制台导入数据

SOURCE /app/server/mysql/sakila-db/sakila-schema.sql;SOURCE /app/server/mysql/sakila-db/sakila-data.sql;

示例如下:

mysql> SOURCE /app/server/mysql/sakila-db/sakila-schema.sql;Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected, 1 warning (0.00 sec)Query OK, 1 row affected (0.00 sec)Database changedQuery OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.03 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.03 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.02 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.02 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql> 

查看数据库

mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sakila             || sys                |+--------------------+5 rows in set (0.00 sec)mysql> 

查看表信息

mysql> USE sakila;Database changedmysql> show tables;+----------------------------+| Tables_in_sakila           |+----------------------------+| actor                      || actor_info                 || address                    || category                   || city                       || country                    || customer                   || customer_list              || film                       || film_actor                 || film_category              || film_list                  || film_text                  || inventory                  || language                   || nicer_but_slower_film_list || payment                    || rental                     || sales_by_film_category     || sales_by_store             || staff                      || staff_list                 || store                      |+----------------------------+23 rows in set (0.00 sec)mysql> 

MySQL数据迁移分析

新建工程

根据下图标记位置,新建工程

填写工程的名称

新建评估

右建新建评估任务,如下所示:

填写评估任务名称、然后点确定

选择数据库类型

本次演示的是mysql文件迁移到达梦,选择mysql然后进入到下一步。

评估选项

评估选项有两种方式,分别是从源库中采集或者从文件中抽取。这里先演示从源库抽取比对,如下图所示:

从源库抽取比对方式

指定模式

根据提示选择需要分析的模式,然后进去下一步

选择所有对象,然后点下一步

审阅评估任务

可以在当前页面查看任务配置时候正确,以表格方式显示便于查看。然后点完成

执行评估任务

执行评估完成后信息如下

选择“查看迁移评估报告”弹出一个新的页面,以表格的形式展示所有对象的兼容率,不兼容等信息,如下图所示

同时也可以导出html报告方便查阅,将文件保存到指定目录

用浏览器打开保存的html文件可以清晰的展示每个对象信息,如下所示:

概要信息

对象兼容详情

从文件中抽取方式

选择从文件中抽取,同时需要指定文件路径

添加SQL文本

点浏览可以选择sql文本,如下所示,在该页面可以添加或者删除,然后点确定

文件编码以实际为准,这里选择utf-8,进入下一步

指定模式

根据提示选择需要分析的模式,然后进去下一步

选择所有对象,然后点下一步

审阅评估任务

可以在当前页面查看任务配置时候正确,以表格方式显示便于查看。然后点完成

执行迁移评估任务

执行评估完成后信息如下

评估报告如下


总结

通过以上评估和规划,您可以:

  1. 明确适配工作量:量化高、中、低风险模块,合理分配资源。
  2. 制定迁移路线图:分阶段验证,降低业务中断风险。
  3. 预置应急方案:针对阻断项设计替代逻辑或回退机制。

建议在正式迁移前,完成至少一轮完整的功能和性能压测,确保迁移后系统符合预期。

相关推荐