国产化迁移这件事,这两年越来越常态化。我最近刚完整走完一套MySQL 5.7迁移到达梦DM8的项目,从表结构转换、数据搬运、存储过程改造,到应用端JDBC驱动切换和上线后的性能收敛,整个过程跨度两周左右。这篇文章想把这次迁移的完整思路、具体操作和踩过的坑整理出来,给正准备做类似迁移的读者一个可以直接参考的路径。
需要说明的是,达梦数据库虽然是国产数据库,但它的语法体系与Oracle高度接近,与MySQL在细节上有不少差异。虽然DM8已经提供了MySQL兼容模式,但并不意味着可以把MySQL的建表语句和存储过程原样搬过去。迁移的核心工作不只是搬运数据,而是对整套SQL方言做一次系统性的适配。
适合看这篇文章的读者:负责国产化改造的DBA、后端开发、运维人员,以及正在评估达梦能否平滑承接MySQL业务的架构师。文章里的操作步骤和报错案例都来自实际项目,可以直接参考。
1. 迁移前的评估:先把家底盘清楚
1.1 达梦的兼容层次说明
达梦DM8其实提供了好几种兼容模式,在初始化实例或者建库的时候可以指定。最核心的参数是COMPATIBLE_MODE:0(默认,倾向于Oracle语法)、1(Oracle兼容)、2(MySQL兼容)、3(PostgreSQL兼容)。这个参数在创建实例时设定,后期改起来比较麻烦,建议一开始就按目标定好。
我的经验是:如果你的业务SQL以MySQL为主,且希望尽量少改SQL,那就把兼容模式设成2;如果团队本身对Oracle更熟,或者后续可能还要接Oracle迁移过来的系统,那就用1,让达梦按照Oracle的习惯去解析SQL。如果拿不准,我建议直接设成1走Oracle路线,因为达梦对Oracle语法的支持是最成熟的,很多MySQL函数在Oracle兼容模式下也能通过改写解决。
但要注意一点,兼容模式解决的是语法解析层面的问题,不等于所有MySQL函数都会自动映射。比如MySQL的IFNULL在MySQL兼容模式下能用,但GROUP_CONCAT这种聚合函数,达梦不管在哪个模式下都没有直接对应物,需要用LISTAGG去改。这些点后面会详细说。
1.2 迁移前要摸清的清单
动手之前,我强烈建议先对源库做一次完整的资产盘点。别偷懒,这一步能帮你提前发现80%的坑。需要梳理的内容包括:
- 实例和库:MySQL实例下有哪些业务库,哪些是核心库,哪些是历史归档库,其实很多已经不用的表没必要迁过去。把范围缩到最小,能省下大量工作量。
- 对象清单:表、视图、存储过程、函数、触发器、事件(Event)的数量。注意MySQL的Event在达梦里没有对应的调度对象,需要改造成达梦的作业(Job)或者交给业务侧定时任务处理。
- 数据量评估:总行数、总大小、单表最大行数、年增长率。这个直接影响迁移方案的选择,比如全量一次性迁移还是分批次增量。
- 字符集:MySQL这边如果是utf8mb4,达梦那边就需要建UTF-8字符集的库,否则特殊字符(emoji、生僻字)会写入失败。
- 使用了哪些MySQL特有的功能:比如分区表、全文索引、JSON类型、WITH ROLLUP、窗口函数等。窗口函数DM8.1以上已经支持,但JSON类型和全文索引就要另外想办法。
我把这些信息整理成一张表格,每个表一行,记录表名、行数、数据大小、字符集、存储引擎、是否分区、有哪些特殊类型字段。这张表在后面迁移验证阶段会反复用到。实际做下来,这个评估表大概花了我半天时间,但从结果看,这笔时间花得很值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:达梦怎么装、工具怎么选
2.1 达梦DM8的安装与初始化
达梦的安装包里包含了服务器端和客户端工具。Linux环境下的安装比较简单,解压后运行DMInstall.bin,会进入图形化安装界面;如果没有图形界面,也可以用命令行静默安装。安装完成后,还需要用dminit工具初始化实例。
关键配置在初始化阶段就要确认好:
bash复制./dminit PATH=/dm/data DM_INI=/dm/data/dm.ini CASE_SENSITIVE=0 CHARSET=1 COMPATIBLE_MODE=2 PAGE_SIZE=16
这里几个参数的意思分别是:
- CASE_SENSITIVE:是否区分大小写。建议设成0,不区分。达梦默认是1区分大小写,这跟MySQL默认不区分大小写的行为不一致。如果保持默认,建表时写了"User"这种双引号大小写敏感的标识符,后面查询很容易报表或视图不存在。
- CHARSET:字符集,1表示UTF-8。前面提到源库是utf8mb4,这里必须对应UTF-8,否则中文字符和特殊符号会有编码问题。
- COMPATIBLE_MODE:按前面说的设成2,走MySQL兼容。
- PAGE_SIZE:页大小,数据量大的库建议16KB,因为页大小直接决定单行记录的最大长度,后面改这个参数要重新初始化实例,非常麻烦。所以宁可在初始化时选大一点,也别等迁移完了再改。
装好实例后,还需要创建用户和表空间。达梦的用户模式是用户即Schema,一个用户对应一个Schema。比如创建一个名为APP的用户,对应的Schema就是APP,所有表都建在这个Schema下。
启动数据库服务的命令一般是:
bash复制systemctl start DmServiceDMSERVER
注意服务名格式是DmService+实例名,实例名在初始化时指定,默认是DMSERVER。这里多提一句,如果你在麒麟V10这类国产操作系统上安装,流程和Linux版本一致,但要注意检查系统依赖库,缺少libncurses之类的库会导致安装界面起不来。
2.2 迁移工具链:DTS、DBeaver、disql、dexp/dimp
达梦自带的可视化迁移工具叫DTS(数据迁移工具,在安装目录的tool目录下),这是整个迁移过程中最核心的工具。DTS支持从MySQL、Oracle、SQLServer、PostgreSQL等主流数据库迁移到达梦,也支持达梦到达梦,甚至达梦到其他数据库。
DTS能做的迁移包括表结构、数据、视图、存储过程、函数、序列等。实际用下来,表结构和数据的迁移很稳,但存储过程和视图的语法转换比较弱,很多要手动改。所以
