前言
从 MySQL 迁移到达梦数据库(DM Database)前,进行全面的兼容性分析和评估至关重要。以下是一套系统的评估流程和关键检查项,帮助您量化工作量、识别风险并制定迁移计划:
兼容性评估阶段
对象兼容性分析
| 对象类型 | 关键检查项 | 工具/方法 |
|---|---|---|
| 表结构 | - 数据类型兼容性(如 BIGINT → BIGINT,TEXT → CLOB) - 自增列、主键、外键约束 - 默认值、非空约束 |
达梦官方工具:DTS(数据迁移工具) SQL脚本对比工具:Beyond Compare、Redgate SQL Compare |
| SQL语法 | - DML(SELECT/INSERT/UPDATE/DELETE)兼容性 - 达梦特有语法(如 MERGE INTO) - 函数兼容性(如 GROUP_CONCAT → LISTAGG) |
达梦SQL兼容模式:SET COMPATIBLE_MODE=4(兼容MySQL) 静态代码扫描工具:Squid、DM SQL Checker |
| 存储过程/函数 | - 流程控制语句(如 DECLARE HANDLER → EXCEPTION) - 变量类型兼容性(如 VARCHAR → VARCHAR2) - 异常处理机制 |
达梦调试工具:DM PL/SQL Debugger 手动逐段验证 + 日志记录 |
| 视图/触发器 | - 视图引用的表或函数是否兼容 - 触发器事件类型(如 BEFORE INSERT → BEFORE 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_CONCAT → LISTAGG,AUTO_INCREMENT → IDENTITY |
| 高 | 需重写代码或重构逻辑(如存储过程、触发器) | 存储过程中依赖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人天 |
迁移实施策略
分阶段迁移
- 试点迁移 • 选择核心模块(如用户管理)进行验证,覆盖典型场景(事务、复杂查询)。 • 验证工具链:达梦DTS + 自定义校验脚本。
- 灰度切换 • 使用dmdrs软件实时同步从
MySQL数据同步达梦,折机切换。 - 全量切换 • 停机窗口内完成最终数据同步,启用达梦高可用方案。
数据迁移工具
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,进入下一步
指定模式
根据提示选择需要分析的模式,然后进去下一步
选择所有对象,然后点下一步
审阅评估任务
可以在当前页面查看任务配置时候正确,以表格方式显示便于查看。然后点完成
执行迁移评估任务
执行评估完成后信息如下
评估报告如下
总结
通过以上评估和规划,您可以:
- 明确适配工作量:量化高、中、低风险模块,合理分配资源。
- 制定迁移路线图:分阶段验证,降低业务中断风险。
- 预置应急方案:针对阻断项设计替代逻辑或回退机制。
建议在正式迁移前,完成至少一轮完整的功能和性能压测,确保迁移后系统符合预期。
1525