摘要 在信创国产化落地过程中MySQL 迁移到达梦 DM9是政务、金融、企业系统最常见的场景之一。很多开发者迁移时踩坑不断SQL 语法报错、函数不兼容、分页异常、自增主键失效、中文乱码、排序行为不一致等问题层出不穷。本文结合多个生产项目实战经验整理一套从环境准备、全量迁移、语法兼容、代码改造、压测验证到上线割接的完整流程。依托达梦高 MySQL 兼容特性实现99% 原有业务 SQL 无需改动仅针对少数特殊语法、函数、配置做微调大幅降低迁移成本与风险。全文附带可直接复用的配置、SQL 对照、避坑方案、报错解决看完即可落地生产环境。核心结论达梦 DM9 深度兼容 MySQL 语法与使用习惯优先开启 MySQL 兼容模式能最大程度做到 SQL 零改动。 前置认知MySQL 与达梦 DM9 核心差异迁移前先理清二者底层区别做到心中有数避免盲目迁移。1. 基础特性对比对比项MySQL 5.7/8.0达梦 DM9内核架构开源关系型数据库完全自主研发国产数据库默认事务隔离级别读已提交读已提交大小写敏感Linux 下表名默认区分大小写字段不区分可通过参数手动开关大小写敏感关键字数量保留字较少多达 1287 个极易出现关键字冲突主流兼容方向通用开源 SQL 语法同时兼容 MySQL、Oracle 双语法体系自增主键仅支持AUTO_INCREMENT支持AUTO_INCREMENT/IDENTITY两种写法分页语法仅支持LIMIT同时支持LIMIT、ROWNUM两种写法2. 迁移整体思路数据库实例层面开启MySQL 兼容模式全局适配 MySQL 语法、函数、执行行为结构迁移批量迁移表、索引、约束、视图、存储过程、触发器数据迁移全量数据同步 数据完整性校验应用层改造替换驱动、调整连接串、配置 MyBatis-Plus 方言、处理少量特殊 SQL功能 性能测试业务功能回归、压力测试、修复兼容性问题灰度割接流量逐步切换平稳完成上线运维。 一、达梦 DM9 环境准备适配 MySQL 模式1.1 前置说明达梦 DM9 安装流程沿用标准 Linux 部署规范创建专用运行用户dmdba、配置系统权限、注册系统服务等基础操作本文不再赘述核心重点为创建 MySQL 兼容模式数据库实例。1.2 创建 MySQL 兼容模式实例关键步骤达梦支持在执行dminit创建实例时直接指定兼容模式推荐该方式一步到位适配 MySQL。 切换至dmdba用户进入达梦安装目录下的bin文件夹执行命令# 创建兼容 MySQL 模式的数据库实例 ./dminit \ path/opt/dmdbms/data \ db_namemysql2dm \ instance_nameDMSERVER \ port_num5236 \ charset1 \ case_sensitive0 \ COMPATIBLE_MODE4参数详解path数据库数据文件存放路径db_name数据库名称可自定义instance_name数据库实例名port_num服务端口默认 5236charset1指定字符集为 UTF-8charset0为 GBK统一使用 UTF-8 避免中文乱码case_sensitive0关闭大小写敏感和 MySQL 默认行为保持一致COMPATIBLE_MODE4核心兼容参数4代表启用 MySQL 兼容模式补充0 默认、1Oracle、2SQL Server、3PostgreSQL、4MySQL1.3 已有实例补充开启 MySQL 兼容应急方案若数据库实例已创建未提前指定兼容模式可修改达梦核心配置文件dm.ini临时开启全局兼容停止达梦服务systemctl stop DmServiceDMSERVER编辑dm.ini文件路径/opt/dmdbms/data/DMSERVER/dm.ini新增 / 修改以下参数# 开启MySQL全局兼容模式 COMPATIBLE_MODE 4 # 完全模拟MySQL GROUP_CONCAT函数行为 GROUP_CONCAT_COMPATIBLE 1 # 模拟MySQL NULL值排序规则 ORDER_BY_NULLS_COMPATIBLE 1重启达梦服务使配置生效systemctl start DmServiceDMSERVER systemctl status DmServiceDMSERVER1.4 客户端连接测试使用 DBeaver、达梦管理工具 DM Management Tool 进行连接验证连接地址127.0.0.1端口5236数据库名mysql2dm账号SYSDBA密码SYSDBA生产环境必须修改默认密码 连接测试通过代表数据库环境准备完成。 二、数据库结构 数据全量迁移两种主流方案本文提供官方 DTS 工具迁移推荐和SQL 脚本迁移两种方案分别适配大数据量集群、小体量单库场景。方案一达梦自带 DTS 迁移工具首选零代码、高成功率DM DTS 是达梦官方配套数据迁移工具原生适配 MySQL 到达梦的迁移场景可自动转换字段类型、表结构、索引、约束、数据是生产环境首选方案。2.1.1 工具位置Windows 客户端达梦数据库客户端 → DM 数据迁移工具 (DTS)Linux 图形环境达梦安装目录tool文件夹下启动 DTS2.1.2 完整迁移步骤打开 DTS 工具新建迁移工程迁移类型选择MySQL → 达梦 DM配置源端 MySQL 信息填写 MySQL 服务地址、端口、数据库名、账号、密码点击「测试连接」配置目标端达梦信息填写 DM9 服务地址、端口、数据库名、账号、密码点击「测试连接」选择迁移对象按需勾选表、视图、函数、存储过程、触发器、事件等数据库对象字段类型映射DTS 会自动完成类型转换无需手动干预主流映射规则如下| MySQL 数据类型 | 达梦 DM9 对应类型 | | ---- | ---- | ---- | | TINYINT | TINYINT | | INT / INTEGER | INT | | BIGINT | BIGINT | | VARCHAR (n) | VARCHAR (n) | | TEXT / LONGTEXT | TEXT / CLOB | | DATETIME | DATETIME | | DATE | DATE | | TIMESTAMP | TIMESTAMP |确认配置后点击开始迁移等待结构与数据同步完成迁移收尾手动核对表数量、字段数量、数据总行数、索引、主键、外键、唯一约束。 避坑提示迁移前建议将 MySQL 设置为只读或暂停业务写入避免迁移过程中新增数据导致两端数据不一致千万级大表建议分批次迁移。方案二SQL 脚本手动迁移适合小库、单表调试仅适用于少量数据表、测试环境迁移通过导出 MySQL 原生 SQL 脚本在达梦客户端直接执行。2.2.1 MySQL 导出 SQL 脚本使用 Navicat、DBeaver 等工具导出表结构 数据脚本导出格式选择兼容ANSI标准。2.2.2 脚本适配与执行MySQL 建表脚本存在专属引擎、字符集配置达梦无法识别需要手动删减同时关键字表名 / 字段建议添加双引号。原 MySQL 脚本CREATE TABLE user_info ( id int AUTO_INCREMENT PRIMARY KEY, username varchar(30) NOT NULL, create_time datetime ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;适配后达梦可执行脚本CREATE TABLE user_info ( id int AUTO_INCREMENT PRIMARY KEY, username varchar(30) NOT NULL, create_time datetime );核心修改点删除ENGINEInnoDB DEFAULT CHARSETutf8mb4等 MySQL 专属配置标识符使用双引号包裹规避关键字冲突。 三、SQL 语法兼容详解99% 语句零改动开启COMPATIBLE_MODE4MySQL 兼容模式后常规增删改查、联表、排序、分组 SQL 均可直接运行。下面分类说明完全兼容、轻微差异、必须改造的语法与函数。3.1 完全兼容无需任何修改3.1.1 DDL 表结构语句建表、删表、改表结构、新增 / 删除索引、主键、唯一约束全部兼容AUTO_INCREMENT自增语法和 MySQL 完全一致。-- MySQL 原生写法达梦直接执行 CREATE TABLE t_test( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) );3.1.2 DML 增删改查语句基础 CRUD 语法 100% 兼容无需调整-- 新增数据 INSERT INTO t_test(name) VALUES (test); -- 条件查询 SELECT * FROM t_test WHERE id 10; -- 数据更新 UPDATE t_test SET namedm9 WHERE id1; -- 数据删除 DELETE FROM t_test WHERE id1;3.1.3 LIMIT 分页语法达梦 MySQL 兼容模式下完整支持 MySQL 风格LIMIT分页业务分页 SQL 无需改动-- 取前10条数据 SELECT * FROM t_test LIMIT 10; -- 分页偏移20条取10条MySQL经典分页写法 SELECT * FROM t_test LIMIT 20,10;3.1.4 基础运算符与逻辑判断and/or/not、大小于、等于、in、like模糊查询、between and区间查询等全部兼容。3.2 函数兼容仅少量特殊函数需改造开启 MySQL 兼容模式后绝大多数 MySQL 常用函数可直接使用仅 JSON 解析等小众函数需要调整。3.2.1 完全兼容的 MySQL 函数直接使用字符串函数CONCAT、SUBSTRING、LENGTH、TRIM、UPPER、LOWER日期函数NOW()、CURDATE()、CURRENT_DATE、DATE_ADD、DATE_SUB判空函数IFNULL()MySQL 专属函数兼容模式原生支持聚合函数SUM、COUNT、MAX、MIN、AVG示例-- IFNULL 判空完全兼容 SELECT IFNULL(name,空) FROM t_test; -- 获取当前系统时间 SELECT NOW(); -- 字符串拼接 SELECT CONCAT(name,_suffix) FROM t_test;3.2.2 GROUP_CONCAT 分组拼接函数GROUP_CONCAT是 MySQL 高频分组函数开启 MySQL 兼容模式后可直接使用-- MySQL原生SQL达梦无需修改 SELECT GROUP_CONCAT(name SEPARATOR ,) FROM t_test GROUP BY id;补充未开启兼容模式时达梦需使用WM_CONCAT迁移场景无需考虑。3.2.3 需替换的特殊函数MySQL 函数达梦兼容写法补充说明DATE_FORMAT(dt,%Y-%m-%d)DATE_FORMAT(dt,%Y-%m-%d)/TO_CHAR(dt,YYYY-MM-DD)兼容模式下原生支持二选一即可FROM_UNIXTIME()FROM_UNIXTIME()DM9 高版本完全兼容JSON_EXTRACT()JSON_VALUE()JSON 解析函数达梦标准写法3.3 排序与 NULL 值规则MySQL 默认规则升序时NULL值排在最前降序时NULL值排在最后。 达梦开启ORDER_BY_NULLS_COMPATIBLE 1后排序行为与 MySQL 完全一致无需修改 SQL。3.4 关键字冲突高频坑点达梦关键字数量远多于 MySQLorder、user、status、level等 MySQL 常用标识符在达梦中属于系统关键字直接使用会报语法错误。统一解决方案SQL 语句层面使用双引号包裹表名、字段名达梦标准标识符应用代码层面MyBatis/MyBatis-Plus 实体类、Mapper 注解中添加双引号长期优化尽量不使用数据库保留字作为表名、字段名。示例-- order 为关键字必须用双引号包裹 SELECT * FROM order WHERE status 1;️ 四、SpringBoot 应用层完整改造核心落地步骤数据库迁移完成后SpringBoot 项目仅需修改驱动依赖、数据源连接串、MyBatis-Plus 配置原有业务代码、SQL 无需改动。4.1 替换 Maven 驱动依赖移除原 MySQL 驱动引入达梦适配 JDK17 的 JDBC 驱动!-- 移除原有 MySQL 驱动 -- !-- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency -- !-- 达梦 DM9 JDBC 驱动适配 JDK17 及以上 -- dependency groupIdcom.dameng/groupId artifactIdDmJdbcDriver18/artifactId version8.1.3.192/version /dependency4.2 修改 application.yml 数据源配置核心修改驱动类、连接 URL、连接探测语句同时删除 MySQL 专属参数。spring: datasource: # 达梦驱动类全限定名 driver-class-name: dm.jdbc.driver.DmDriver # 达梦连接地址指向MySQL兼容实例 url: jdbc:dm://127.0.0.1:5236/mysql2dm?schemaPUBLICuseUnicodetruecharacterEncodingutf8 username: SYSDBA password: YourPwd123 type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 30 idle-timeout: 30000 max-lifetime: 1800000 connection-timeout: 30000 # 达梦强制要求连接探测必须使用 DUAL 虚拟表 connection-test-query: SELECT 1 FROM DUAL⚠️ 关键避坑达梦不支持MySQL 连接参数rewriteBatchedStatementstrue务必删除该参数无效且会引发异常密码包含 、# 等特殊符号时建议使用单引号包裹密码连接探测语句必须写SELECT 1 FROM DUAL否则 Hikari 连接池持续报错。4.3 MyBatis-Plus 配置修改分页、方言核心配置原有 MySQL 方言必须替换为达梦方言否则分页、逻辑删除、SQL 生成都会异常。4.3.1 插件配置类import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.baomidou.mybatisplus.annotation.DbType; Configuration MapperScan(com.xxx.mapper) // 替换为自己项目的mapper路径 public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 分页插件明确指定数据库类型为 DbType.DM达梦 PaginationInnerInterceptor pageInterceptor new PaginationInnerInterceptor(DbType.DM); pageInterceptor.setOverflow(true); // 页码溢出返回第一页 interceptor.addInnerInterceptor(pageInterceptor); // 乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 防全表更新/删除插件生产环境必开 interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); return interceptor; } }4.3.2 全局方言配置ymlmybatis-plus: global-config: db-config: dialect: com.baomidou.mybatisplus.extension.plugins.inner.DmDialect4.4 实体类 Mapper 适配关键字处理若表名、字段名是达梦关键字在 MP 注解中使用双引号包裹非关键字场景无需任何修改。import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(\order\) // 关键字表名添加双引号 public class Order { // 自增主键AUTO模式和MySQL行为一致 TableId(type IdType.AUTO) private Integer id; TableField(\status\) // 关键字字段添加双引号 private Integer status; }4.5 批量插入性能优化MyBatis-Plus 原生saveBatch在达梦中会循环单条插入性能极差。建议使用自定义 SQL 注入器实现批量插入业务调用代码保持不变。 相关代码参考自定义CustomSqlInjector、扩展BaseMapper增加insertBatchSomeColumn方法前文已有完整实现此处不再重复。✅ 五、功能回归 数据校验迁移必做环节应用改造完成并正常启动后必须执行多轮验证保证迁移后功能、数据完全一致。5.1 基础连通性验证项目正常启动无驱动、连接、方言相关报错单条查询、列表查询接口正常返回数据新增、修改、删除操作正常数据可正常落库。5.2 业务 SQL 全量回归测试重点覆盖核心业务场景分页查询、多条件模糊查询、多表联查分组统计、GROUP_CONCAT字符串拼接日期函数、判空函数、JSON 解析场景事务场景达梦完整支持 Spring 声明式事务。5.3 数据一致性校验全表行数对比MySQL 表总行数 达梦表总行数抽样校验随机抽取多条数据核对字段内容、时间、字符串、数字是否完全一致大表校验千万级数据表优先核对主键、索引、核心业务字段。5.4 中文乱码校验执行中文新增、查询操作确认无乱码。若出现乱码排查两点达梦实例创建参数charset1UTF-8连接 URL 中配置useUnicodetruecharacterEncodingutf8。 六、生产环境调优 上线割接6.1 达梦数据库生产参数调优适配 MySQL 业务修改dm.ini配置文件根据服务器硬件与业务并发优化参数修改后重启服务生效# 数据缓冲区8G内存建议设为204816G及以上建议4096 BUFFER 2048 # 最大会话连接数根据业务并发调整 MAX_SESSIONS 500 # 慢SQL阈值执行超过1秒的SQL记录日志 LOG_MIN_DURATION_STATEMENT 1000 # 开启MySQL兼容全套参数 COMPATIBLE_MODE 4 GROUP_CONCAT_COMPATIBLE 1 ORDER_BY_NULLS_COMPATIBLE 16.2 应用生产配置收紧关闭 MyBatis SQL 控制台日志减少磁盘 IO基于线上并发优化 Hikari 连接池参数重置数据库默认账号密码使用强密码策略配置防火墙仅允许应用服务器访问数据库 5236 端口。6.3 灰度割接方案零停机上线生产标准流程双写阶段应用同时写入 MySQL 和达梦读取流量仍走 MySQL持续 1~3 天观察数据同步状态读流量切换逐步将查询流量切到达梦写入保留双写监控日志、报错、接口响应耗时停用旧库写入确认运行稳定后停止向 MySQL 写入全量读写切换至达梦下线旧库稳定运行 7~15 天无异常后下线原 MySQL 数据库。❌ 七、迁移高频报错 一键解决方案报错现象根因解决方案表 / 视图不存在、无效标识符表名 / 字段名命中达梦关键字使用双引号包裹标识符Hikari 连接探测失败探测语句不符合达梦规范改为SELECT 1 FROM DUAL分页查询总条数为 0、分页失效MyBatis-Plus 未配置达梦方言 / 分页类型配置DmDialect分页插件指定DbType.DMAUTO_INCREMENT 自增失效数据库未开启 MySQL 兼容模式设置COMPATIBLE_MODE4并重启服务中文乱码字符集配置错误实例使用 UTF-8连接串指定编码参数批量插入速度极慢使用 MP 原生 saveBatch循环单条插入改用自定义InsertBatchSomeColumn批量方法IFNULL/GROUP_CONCAT 函数不存在未开启 MySQL 兼容开启COMPATIBLE_MODE4并重启服务启动报驱动类找不到驱动依赖缺失 / 版本不匹配引入DmJdbcDriver18对应版本驱动 八、总结核心逻辑MySQL 迁移达梦 DM9开启 MySQL 兼容模式是实现 99% SQL 零改动的核心优先在创建实例时指定COMPATIBLE_MODE4标准迁移流程搭建兼容实例 → DTS 迁移结构与数据 → 改造应用驱动 / 连接串 / MP 方言 → 功能数据校验 → 灰度上线改造范围仅需替换驱动、修改连接配置、适配 MP 方言原有业务 SQL、Java 代码基本无需调整重点风险防控关键字冲突、连接探测语句、批量插入性能、中文乱码四大问题为迁移高频坑点提前规避。达梦 DM9 对 MySQL 生态兼容性成熟中小项目 1~2 天即可完成全量迁移大型系统采用分库分表、灰度切换的方式可有效控制迁移风险。专注 SpringBoot 国产数据库信创实战持续更新达梦、人大金仓、openGauss 迁移与适配教程点赞 收藏 关注后续分享 Oracle 迁移达梦、达梦高可用集群搭建实战。
MySQL 迁移至达梦 DM9 完整改造指南|99% SQL 零改动
发布时间:2026/5/30 6:27:12
摘要 在信创国产化落地过程中MySQL 迁移到达梦 DM9是政务、金融、企业系统最常见的场景之一。很多开发者迁移时踩坑不断SQL 语法报错、函数不兼容、分页异常、自增主键失效、中文乱码、排序行为不一致等问题层出不穷。本文结合多个生产项目实战经验整理一套从环境准备、全量迁移、语法兼容、代码改造、压测验证到上线割接的完整流程。依托达梦高 MySQL 兼容特性实现99% 原有业务 SQL 无需改动仅针对少数特殊语法、函数、配置做微调大幅降低迁移成本与风险。全文附带可直接复用的配置、SQL 对照、避坑方案、报错解决看完即可落地生产环境。核心结论达梦 DM9 深度兼容 MySQL 语法与使用习惯优先开启 MySQL 兼容模式能最大程度做到 SQL 零改动。 前置认知MySQL 与达梦 DM9 核心差异迁移前先理清二者底层区别做到心中有数避免盲目迁移。1. 基础特性对比对比项MySQL 5.7/8.0达梦 DM9内核架构开源关系型数据库完全自主研发国产数据库默认事务隔离级别读已提交读已提交大小写敏感Linux 下表名默认区分大小写字段不区分可通过参数手动开关大小写敏感关键字数量保留字较少多达 1287 个极易出现关键字冲突主流兼容方向通用开源 SQL 语法同时兼容 MySQL、Oracle 双语法体系自增主键仅支持AUTO_INCREMENT支持AUTO_INCREMENT/IDENTITY两种写法分页语法仅支持LIMIT同时支持LIMIT、ROWNUM两种写法2. 迁移整体思路数据库实例层面开启MySQL 兼容模式全局适配 MySQL 语法、函数、执行行为结构迁移批量迁移表、索引、约束、视图、存储过程、触发器数据迁移全量数据同步 数据完整性校验应用层改造替换驱动、调整连接串、配置 MyBatis-Plus 方言、处理少量特殊 SQL功能 性能测试业务功能回归、压力测试、修复兼容性问题灰度割接流量逐步切换平稳完成上线运维。 一、达梦 DM9 环境准备适配 MySQL 模式1.1 前置说明达梦 DM9 安装流程沿用标准 Linux 部署规范创建专用运行用户dmdba、配置系统权限、注册系统服务等基础操作本文不再赘述核心重点为创建 MySQL 兼容模式数据库实例。1.2 创建 MySQL 兼容模式实例关键步骤达梦支持在执行dminit创建实例时直接指定兼容模式推荐该方式一步到位适配 MySQL。 切换至dmdba用户进入达梦安装目录下的bin文件夹执行命令# 创建兼容 MySQL 模式的数据库实例 ./dminit \ path/opt/dmdbms/data \ db_namemysql2dm \ instance_nameDMSERVER \ port_num5236 \ charset1 \ case_sensitive0 \ COMPATIBLE_MODE4参数详解path数据库数据文件存放路径db_name数据库名称可自定义instance_name数据库实例名port_num服务端口默认 5236charset1指定字符集为 UTF-8charset0为 GBK统一使用 UTF-8 避免中文乱码case_sensitive0关闭大小写敏感和 MySQL 默认行为保持一致COMPATIBLE_MODE4核心兼容参数4代表启用 MySQL 兼容模式补充0 默认、1Oracle、2SQL Server、3PostgreSQL、4MySQL1.3 已有实例补充开启 MySQL 兼容应急方案若数据库实例已创建未提前指定兼容模式可修改达梦核心配置文件dm.ini临时开启全局兼容停止达梦服务systemctl stop DmServiceDMSERVER编辑dm.ini文件路径/opt/dmdbms/data/DMSERVER/dm.ini新增 / 修改以下参数# 开启MySQL全局兼容模式 COMPATIBLE_MODE 4 # 完全模拟MySQL GROUP_CONCAT函数行为 GROUP_CONCAT_COMPATIBLE 1 # 模拟MySQL NULL值排序规则 ORDER_BY_NULLS_COMPATIBLE 1重启达梦服务使配置生效systemctl start DmServiceDMSERVER systemctl status DmServiceDMSERVER1.4 客户端连接测试使用 DBeaver、达梦管理工具 DM Management Tool 进行连接验证连接地址127.0.0.1端口5236数据库名mysql2dm账号SYSDBA密码SYSDBA生产环境必须修改默认密码 连接测试通过代表数据库环境准备完成。 二、数据库结构 数据全量迁移两种主流方案本文提供官方 DTS 工具迁移推荐和SQL 脚本迁移两种方案分别适配大数据量集群、小体量单库场景。方案一达梦自带 DTS 迁移工具首选零代码、高成功率DM DTS 是达梦官方配套数据迁移工具原生适配 MySQL 到达梦的迁移场景可自动转换字段类型、表结构、索引、约束、数据是生产环境首选方案。2.1.1 工具位置Windows 客户端达梦数据库客户端 → DM 数据迁移工具 (DTS)Linux 图形环境达梦安装目录tool文件夹下启动 DTS2.1.2 完整迁移步骤打开 DTS 工具新建迁移工程迁移类型选择MySQL → 达梦 DM配置源端 MySQL 信息填写 MySQL 服务地址、端口、数据库名、账号、密码点击「测试连接」配置目标端达梦信息填写 DM9 服务地址、端口、数据库名、账号、密码点击「测试连接」选择迁移对象按需勾选表、视图、函数、存储过程、触发器、事件等数据库对象字段类型映射DTS 会自动完成类型转换无需手动干预主流映射规则如下| MySQL 数据类型 | 达梦 DM9 对应类型 | | ---- | ---- | ---- | | TINYINT | TINYINT | | INT / INTEGER | INT | | BIGINT | BIGINT | | VARCHAR (n) | VARCHAR (n) | | TEXT / LONGTEXT | TEXT / CLOB | | DATETIME | DATETIME | | DATE | DATE | | TIMESTAMP | TIMESTAMP |确认配置后点击开始迁移等待结构与数据同步完成迁移收尾手动核对表数量、字段数量、数据总行数、索引、主键、外键、唯一约束。 避坑提示迁移前建议将 MySQL 设置为只读或暂停业务写入避免迁移过程中新增数据导致两端数据不一致千万级大表建议分批次迁移。方案二SQL 脚本手动迁移适合小库、单表调试仅适用于少量数据表、测试环境迁移通过导出 MySQL 原生 SQL 脚本在达梦客户端直接执行。2.2.1 MySQL 导出 SQL 脚本使用 Navicat、DBeaver 等工具导出表结构 数据脚本导出格式选择兼容ANSI标准。2.2.2 脚本适配与执行MySQL 建表脚本存在专属引擎、字符集配置达梦无法识别需要手动删减同时关键字表名 / 字段建议添加双引号。原 MySQL 脚本CREATE TABLE user_info ( id int AUTO_INCREMENT PRIMARY KEY, username varchar(30) NOT NULL, create_time datetime ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;适配后达梦可执行脚本CREATE TABLE user_info ( id int AUTO_INCREMENT PRIMARY KEY, username varchar(30) NOT NULL, create_time datetime );核心修改点删除ENGINEInnoDB DEFAULT CHARSETutf8mb4等 MySQL 专属配置标识符使用双引号包裹规避关键字冲突。 三、SQL 语法兼容详解99% 语句零改动开启COMPATIBLE_MODE4MySQL 兼容模式后常规增删改查、联表、排序、分组 SQL 均可直接运行。下面分类说明完全兼容、轻微差异、必须改造的语法与函数。3.1 完全兼容无需任何修改3.1.1 DDL 表结构语句建表、删表、改表结构、新增 / 删除索引、主键、唯一约束全部兼容AUTO_INCREMENT自增语法和 MySQL 完全一致。-- MySQL 原生写法达梦直接执行 CREATE TABLE t_test( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) );3.1.2 DML 增删改查语句基础 CRUD 语法 100% 兼容无需调整-- 新增数据 INSERT INTO t_test(name) VALUES (test); -- 条件查询 SELECT * FROM t_test WHERE id 10; -- 数据更新 UPDATE t_test SET namedm9 WHERE id1; -- 数据删除 DELETE FROM t_test WHERE id1;3.1.3 LIMIT 分页语法达梦 MySQL 兼容模式下完整支持 MySQL 风格LIMIT分页业务分页 SQL 无需改动-- 取前10条数据 SELECT * FROM t_test LIMIT 10; -- 分页偏移20条取10条MySQL经典分页写法 SELECT * FROM t_test LIMIT 20,10;3.1.4 基础运算符与逻辑判断and/or/not、大小于、等于、in、like模糊查询、between and区间查询等全部兼容。3.2 函数兼容仅少量特殊函数需改造开启 MySQL 兼容模式后绝大多数 MySQL 常用函数可直接使用仅 JSON 解析等小众函数需要调整。3.2.1 完全兼容的 MySQL 函数直接使用字符串函数CONCAT、SUBSTRING、LENGTH、TRIM、UPPER、LOWER日期函数NOW()、CURDATE()、CURRENT_DATE、DATE_ADD、DATE_SUB判空函数IFNULL()MySQL 专属函数兼容模式原生支持聚合函数SUM、COUNT、MAX、MIN、AVG示例-- IFNULL 判空完全兼容 SELECT IFNULL(name,空) FROM t_test; -- 获取当前系统时间 SELECT NOW(); -- 字符串拼接 SELECT CONCAT(name,_suffix) FROM t_test;3.2.2 GROUP_CONCAT 分组拼接函数GROUP_CONCAT是 MySQL 高频分组函数开启 MySQL 兼容模式后可直接使用-- MySQL原生SQL达梦无需修改 SELECT GROUP_CONCAT(name SEPARATOR ,) FROM t_test GROUP BY id;补充未开启兼容模式时达梦需使用WM_CONCAT迁移场景无需考虑。3.2.3 需替换的特殊函数MySQL 函数达梦兼容写法补充说明DATE_FORMAT(dt,%Y-%m-%d)DATE_FORMAT(dt,%Y-%m-%d)/TO_CHAR(dt,YYYY-MM-DD)兼容模式下原生支持二选一即可FROM_UNIXTIME()FROM_UNIXTIME()DM9 高版本完全兼容JSON_EXTRACT()JSON_VALUE()JSON 解析函数达梦标准写法3.3 排序与 NULL 值规则MySQL 默认规则升序时NULL值排在最前降序时NULL值排在最后。 达梦开启ORDER_BY_NULLS_COMPATIBLE 1后排序行为与 MySQL 完全一致无需修改 SQL。3.4 关键字冲突高频坑点达梦关键字数量远多于 MySQLorder、user、status、level等 MySQL 常用标识符在达梦中属于系统关键字直接使用会报语法错误。统一解决方案SQL 语句层面使用双引号包裹表名、字段名达梦标准标识符应用代码层面MyBatis/MyBatis-Plus 实体类、Mapper 注解中添加双引号长期优化尽量不使用数据库保留字作为表名、字段名。示例-- order 为关键字必须用双引号包裹 SELECT * FROM order WHERE status 1;️ 四、SpringBoot 应用层完整改造核心落地步骤数据库迁移完成后SpringBoot 项目仅需修改驱动依赖、数据源连接串、MyBatis-Plus 配置原有业务代码、SQL 无需改动。4.1 替换 Maven 驱动依赖移除原 MySQL 驱动引入达梦适配 JDK17 的 JDBC 驱动!-- 移除原有 MySQL 驱动 -- !-- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency -- !-- 达梦 DM9 JDBC 驱动适配 JDK17 及以上 -- dependency groupIdcom.dameng/groupId artifactIdDmJdbcDriver18/artifactId version8.1.3.192/version /dependency4.2 修改 application.yml 数据源配置核心修改驱动类、连接 URL、连接探测语句同时删除 MySQL 专属参数。spring: datasource: # 达梦驱动类全限定名 driver-class-name: dm.jdbc.driver.DmDriver # 达梦连接地址指向MySQL兼容实例 url: jdbc:dm://127.0.0.1:5236/mysql2dm?schemaPUBLICuseUnicodetruecharacterEncodingutf8 username: SYSDBA password: YourPwd123 type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 30 idle-timeout: 30000 max-lifetime: 1800000 connection-timeout: 30000 # 达梦强制要求连接探测必须使用 DUAL 虚拟表 connection-test-query: SELECT 1 FROM DUAL⚠️ 关键避坑达梦不支持MySQL 连接参数rewriteBatchedStatementstrue务必删除该参数无效且会引发异常密码包含 、# 等特殊符号时建议使用单引号包裹密码连接探测语句必须写SELECT 1 FROM DUAL否则 Hikari 连接池持续报错。4.3 MyBatis-Plus 配置修改分页、方言核心配置原有 MySQL 方言必须替换为达梦方言否则分页、逻辑删除、SQL 生成都会异常。4.3.1 插件配置类import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.baomidou.mybatisplus.annotation.DbType; Configuration MapperScan(com.xxx.mapper) // 替换为自己项目的mapper路径 public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 分页插件明确指定数据库类型为 DbType.DM达梦 PaginationInnerInterceptor pageInterceptor new PaginationInnerInterceptor(DbType.DM); pageInterceptor.setOverflow(true); // 页码溢出返回第一页 interceptor.addInnerInterceptor(pageInterceptor); // 乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 防全表更新/删除插件生产环境必开 interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); return interceptor; } }4.3.2 全局方言配置ymlmybatis-plus: global-config: db-config: dialect: com.baomidou.mybatisplus.extension.plugins.inner.DmDialect4.4 实体类 Mapper 适配关键字处理若表名、字段名是达梦关键字在 MP 注解中使用双引号包裹非关键字场景无需任何修改。import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(\order\) // 关键字表名添加双引号 public class Order { // 自增主键AUTO模式和MySQL行为一致 TableId(type IdType.AUTO) private Integer id; TableField(\status\) // 关键字字段添加双引号 private Integer status; }4.5 批量插入性能优化MyBatis-Plus 原生saveBatch在达梦中会循环单条插入性能极差。建议使用自定义 SQL 注入器实现批量插入业务调用代码保持不变。 相关代码参考自定义CustomSqlInjector、扩展BaseMapper增加insertBatchSomeColumn方法前文已有完整实现此处不再重复。✅ 五、功能回归 数据校验迁移必做环节应用改造完成并正常启动后必须执行多轮验证保证迁移后功能、数据完全一致。5.1 基础连通性验证项目正常启动无驱动、连接、方言相关报错单条查询、列表查询接口正常返回数据新增、修改、删除操作正常数据可正常落库。5.2 业务 SQL 全量回归测试重点覆盖核心业务场景分页查询、多条件模糊查询、多表联查分组统计、GROUP_CONCAT字符串拼接日期函数、判空函数、JSON 解析场景事务场景达梦完整支持 Spring 声明式事务。5.3 数据一致性校验全表行数对比MySQL 表总行数 达梦表总行数抽样校验随机抽取多条数据核对字段内容、时间、字符串、数字是否完全一致大表校验千万级数据表优先核对主键、索引、核心业务字段。5.4 中文乱码校验执行中文新增、查询操作确认无乱码。若出现乱码排查两点达梦实例创建参数charset1UTF-8连接 URL 中配置useUnicodetruecharacterEncodingutf8。 六、生产环境调优 上线割接6.1 达梦数据库生产参数调优适配 MySQL 业务修改dm.ini配置文件根据服务器硬件与业务并发优化参数修改后重启服务生效# 数据缓冲区8G内存建议设为204816G及以上建议4096 BUFFER 2048 # 最大会话连接数根据业务并发调整 MAX_SESSIONS 500 # 慢SQL阈值执行超过1秒的SQL记录日志 LOG_MIN_DURATION_STATEMENT 1000 # 开启MySQL兼容全套参数 COMPATIBLE_MODE 4 GROUP_CONCAT_COMPATIBLE 1 ORDER_BY_NULLS_COMPATIBLE 16.2 应用生产配置收紧关闭 MyBatis SQL 控制台日志减少磁盘 IO基于线上并发优化 Hikari 连接池参数重置数据库默认账号密码使用强密码策略配置防火墙仅允许应用服务器访问数据库 5236 端口。6.3 灰度割接方案零停机上线生产标准流程双写阶段应用同时写入 MySQL 和达梦读取流量仍走 MySQL持续 1~3 天观察数据同步状态读流量切换逐步将查询流量切到达梦写入保留双写监控日志、报错、接口响应耗时停用旧库写入确认运行稳定后停止向 MySQL 写入全量读写切换至达梦下线旧库稳定运行 7~15 天无异常后下线原 MySQL 数据库。❌ 七、迁移高频报错 一键解决方案报错现象根因解决方案表 / 视图不存在、无效标识符表名 / 字段名命中达梦关键字使用双引号包裹标识符Hikari 连接探测失败探测语句不符合达梦规范改为SELECT 1 FROM DUAL分页查询总条数为 0、分页失效MyBatis-Plus 未配置达梦方言 / 分页类型配置DmDialect分页插件指定DbType.DMAUTO_INCREMENT 自增失效数据库未开启 MySQL 兼容模式设置COMPATIBLE_MODE4并重启服务中文乱码字符集配置错误实例使用 UTF-8连接串指定编码参数批量插入速度极慢使用 MP 原生 saveBatch循环单条插入改用自定义InsertBatchSomeColumn批量方法IFNULL/GROUP_CONCAT 函数不存在未开启 MySQL 兼容开启COMPATIBLE_MODE4并重启服务启动报驱动类找不到驱动依赖缺失 / 版本不匹配引入DmJdbcDriver18对应版本驱动 八、总结核心逻辑MySQL 迁移达梦 DM9开启 MySQL 兼容模式是实现 99% SQL 零改动的核心优先在创建实例时指定COMPATIBLE_MODE4标准迁移流程搭建兼容实例 → DTS 迁移结构与数据 → 改造应用驱动 / 连接串 / MP 方言 → 功能数据校验 → 灰度上线改造范围仅需替换驱动、修改连接配置、适配 MP 方言原有业务 SQL、Java 代码基本无需调整重点风险防控关键字冲突、连接探测语句、批量插入性能、中文乱码四大问题为迁移高频坑点提前规避。达梦 DM9 对 MySQL 生态兼容性成熟中小项目 1~2 天即可完成全量迁移大型系统采用分库分表、灰度切换的方式可有效控制迁移风险。专注 SpringBoot 国产数据库信创实战持续更新达梦、人大金仓、openGauss 迁移与适配教程点赞 收藏 关注后续分享 Oracle 迁移达梦、达梦高可用集群搭建实战。