达梦数据库迁移工具没有MySQL选项?排查与替代方案全解析 上周有个朋友在群里发来一张截图达梦数据库的迁移工具打开之后新建迁移的源数据库类型列表里翻来翻去就是没有MySQL。他第一反应是达梦不支持MySQL迁移正准备用最原始的手工建表方式慢慢导。我拦住他说先别急着换方案这个问题大多数时候不是达梦不支持而是你手里的迁移工具不完整或者装库的版本偏老。今天就把这个问题的排查过程和替代方案完整写出来包括我实际踩过的坑和验证过的做法给遇到同样问题的人一条清晰的路。这篇文章默认你已经有了一套达梦数据库环境并且手里有MySQL的业务库需要迁过去。我会先带你从头排查为什么没有MySQL选项再给出让选项重新出现的修复方式最后提供几条不依赖该选项也能完成迁移的替代路线专门给那些暂时拿不到标准安装包、又急着迁移的人参考。1. 先确认你打开的是不是完整的DM数据迁移工具1.1 DTS的标准启动方式与界面布局达梦数据库自带的迁移工具全名叫“DM数据迁移工具”在安装目录里通常叫dts。它随数据库一起安装没有单独的独立安装包这也是很多人找半天找不到入口的原因。Windows环境下安装完达梦后在开始菜单的“达梦数据库”文件夹里能找到一个“DM数据迁移工具”的快捷方式点击即可启动。如果快捷方式丢失也可以直接到安装目录下的tool文件夹里找dts.exe。常见的安装路径是D:\dmdbms\tool或C:\dmdbms\tool。Linux环境下工具位于达梦安装目录的tool子目录下。假设安装目录是/dm8就执行cd /dm8/tool ./dts启动DTS之后左侧是对象导航区默认有一个“工程”节点。正确操作路径是在“工程”上右键选择“新建迁移”此时才会弹出迁移向导。向导的第一步就是让你选择“源数据库类型”在这个下拉列表里才会出现MySQL、Oracle、SQL Server、PostgreSQL等选项。很多人卡住的原因不是工具真的没有MySQL而是没找到“新建迁移”这个入口。如果直接在菜单里翻找“导入数据”或“连接MySQL”自然什么都找不到。这一点先自查一下。1.2 三种“没有MySQL选项”的具体表现根据我接触过的案例“没有MySQL选项”其实分三种情况处理方向完全不同源数据库类型下拉列表里完全没有“MySQL”这一项。这种最常见基本可以确定是迁移工具组件不完整或版本太老。列表里有“MySQL”但灰色不可选。这种情况通常发生在某些受限的定制版DTS里也可能是当前安装介质不包含MySQL的驱动支持。在“其他数据库”或“通用数据库”分组展开后也看不到任何与MySQL相关的子选项。这说明DTS在运行时没有加载到MySQL的驱动信息。这三种表现对应的问题根源略有差异但排查路径基本是重叠的先按下一章的方式逐层确认就能定位具体是哪种。1.3 定制版、精简版与历史版本的真实差异达梦数据库的发行情况比你想的复杂。除了官网能下载到的标准版还有不少项目定制版、行业专项版、甚至是集成商二次封装过的安装包。我曾经在一个项目现场碰到过一套达梦V8DTS工具打开后源类型列表里只有“Oracle”和“文本文件”其他什么都没有后来发现是安装包本身就做了裁剪把MySQL、PostgreSQL的迁移组件全删了。历史版本也是一个重要因素。达梦DM6、DM7时代的迁移工具主要面向Oracle平滑迁移对MySQL的支持并不完善。DM8早期的一些Build虽然已经有MySQL选项但后续版本才逐步修复了各类兼容问题。如果你手上的环境是很久以前部署的一直没有升级过那没有MySQL选项是比较正常的。所以拿到问题第一步不是到处找第三方工具而是确认你当前这套达梦的版本和安装包来源。2. 从安装目录和版本信息入手做排查2.1 一条SQL确认达梦内核版本在开始折腾安装包之前先用最直接的方式确认达梦数据库的版本。在达梦自带的管理工具或disql里执行SELECT * FROM v$version;输出结果通常类似DM Database Server 64 V8.1.2.128前面的V8是主版本后面是具体的Build号。也可以使用dmrman查看在命令行下进入达梦安装目录的bin子目录cd /dm8/bin ./dmrman show version;拿到版本号之后心里先有个数如果主版本是V7或更老DTS没有MySQL选项是正常的能迁移的异构数据库本身就有限如果是V8但Build号很旧比如早期某个测试版也可能带不动MySQL迁移。我建议把版本信息记录下来无论是后续联系原厂还是自己找安装包都有据可查。2.2 检查tool目录和bin目录的文件清单版本信息拿到之后再看安装目录是否完整。一个正常的达梦V8安装目录里bin和tool两个子目录内容应该是这样的bin目录dmserver数据库服务、disql命令行工具、dmrman备份恢复工具、dmsvc服务管理等。tool目录dts迁移工具、manager管理工具、console控制台、sql助手等。在Linux下可以这样检查ls -l /dm8/tool/ ls -l /dm8/bin/ | head -50重点看tool目录下有没有dts这个文件。如果dts都没有说明安装时“迁移工具”组件就没被装上或者安装包本身有问题。这种情况在Linux服务器上尤其常见因为安装时很多人只选了“数据库服务端”没安装客户端工具组件。Windows下类似检查D:\dmdbms\tool目录下是否有dts.exe文件大小是否正常。如果文件很小比如几十KB也很可疑正常的dts.exe通常有几百KB甚至更大。2.3 多版本共存导致的“启错工具”还有一种情况容易被忽略一台机器上装过多套达梦数据库或者历史机器上曾经有过老版本。系统PATH环境变量可能指向旧版本的bin/tool目录你双击启动的DTS实际上是老版本自然没有MySQL选项。判断方法很直接先看当前达梦数据库服务注册的路径到底指向哪个安装目录再启动同目录下的DTS。在Windows服务管理器里找到达梦相关服务右键查看属性里的可执行文件路径在Linux下通过ps命令看dmserver进程的完整路径ps -ef | grep dmserver然后启动对应安装目录下的工具/opt/dmdbms/tool/dts不要直接用系统PATH里的dts命令因为你不知道它指向哪里。用绝对路径最保险。2.4 图形界面依赖问题Linux服务器上启动DTS还有一个坑DTS是Java Swing图形客户端必须依赖X11显示环境。如果服务器上没有图形界面也没有做X11转发执行./dts会直接报错类似Cant connect to X11 window server。很多人把这个报错误认为是“工具缺失”或“没有MySQL选项”的直接原因其实只是界面起不来。解决思路有两个一是配置X11转发在本地SSH客户端里启用X11然后在服务器上执行./dts二是干脆不用DTS用后面第四章提到的替代方案。3. 让MySQL选项重新出现的修复路径3.1 用完整标准安装包做修复安装或组件补装当你确认当前安装确实不完整、版本确实偏老之后最稳妥的修复方式是用一套完整的标准安装包重新安装或修复组件。达梦在Windows下的安装程序一般会有“修改”、“修复”、“删除”三个选项。选择“修改”在组件列表里勾选“数据库迁移工具”或“客户端工具”然后继续安装就能把缺失的组件补上。整个过程不需要动数据库实例不会影响已有数据。Linux下没有图形化的修改向导通常做法是重新执行安装程序安装到同一个目录。安装程序会识别到已有达梦环境询问是覆盖还是另建新环境。此时选择覆盖安装到原目录组件勾选完整安装完成后重启达梦服务即可。这里有一个非常重要的前提如果你在生产环境上操作重装前必须备份。我一般的习惯是先用dmrman做一次完整备份再把数据库物理目录拷贝一份到其他磁盘双保险。具体备份命令可以参考cd /dm8/bin ./dmrman backup database /dm8/data/DAMENG/dm.ini full backupset /dm8/backup/backup_20240101;3.2 直接升级到达梦新版本如果当前版本实在老得离谱比如还是DM7或DM8早期Build也不建议在旧版本上折腾修复了直接申请新版本的标准安装介质升级。达梦的升级过程通常不复杂但要注意以下几点升级前备份数据库物理文件、dm.ini参数文件和备份集。停掉数据库实例确保没有活动连接。安装新版本到新目录或者覆盖安装到原目录。启动数据库服务确认版本号已更新。升级完成后DTS的源数据库类型列表一般会恢复正常。MySQL、PostgreSQL、SQL Server等异构数据库迁移选项都会出现。需要说明的是达梦不同版本之间数据目录可能存在兼容性差异升级前最好在测试环境演练一遍不要在没验证的情况下直接对生产库动手。3.3 Java环境与组件依赖检查DTS本身是Java客户端对Java运行时环境有依赖。如果服务器上同时装了其他Java套件比如Oracle JDK、OpenJDKJAVA_HOME和PATH指向错误DTS虽然能启动但部分插件可能加载异常导致源数据库类型列表显示不全。达梦安装目录下一般自带了一套JDK比如/dm8/jdk。修复方式很简单启动前临时指定用达梦自带的JDKexport JAVA_HOME/dm8/jdk export PATH$JAVA_HOME/bin:$PATH cd /dm8/tool ./dtsWindows下则建议不要手动设置全局JAVA_HOME让DTS使用自身集成的JRE。如果系统里确实装过其他Java环境导致冲突可以把达梦工具快捷方式的目标改一下手工指定jre路径。3.4 修复后的验证方法组件修复或版本升级完成后别急着直接连生产库。先打开DTS新建一个迁移工程进入“新建迁移”向导确认源数据库类型下拉列表里确实出现了“MySQL”。再尝试用测试环境MySQL连接一次验证DTS能正常读取到MySQL的表结构。我见过一种情况工具正常了MySQL选项也出现了但连接时一直报驱动加载失败。这多半是DTS内置的MySQL JDBC驱动版本和MySQL服务端版本不匹配。比如MySQL 8.0以上需要mysql-connector-java 8.x而老版本DTS内置的还是5.x驱动。解决办法是把对应版本的MySQL JDBC驱动jar包放到DTS的驱动目录下具体位置一般在tool目录的lib或driver子目录。4. 没有MySQL选项时也能迁移的完整替代路线这一章是重点。现实中总会遇到拿不到标准安装包、没法升级、又急需迁移的情况。下面这几条替代路线都是我自己实操验证过的按照推荐程度从高到低排列。4.1 方案一mysqldump导出SQL加disql导入这个方案不依赖任何图形工具只需要能访问MySQL的命令行以及达梦服务器上的disql工具即可。核心思路是把MySQL的数据和结构导出成SQL文件经过适当改造后在达梦中执行。先从MySQL导出mysqldump -h127.0.0.1 -uroot -p --single-transaction --default-character-setutf8mb4 --compatibleansi --skip-triggers dbname dbname.sql--single-transaction保证InnoDB表导出时数据一致--compatibleansi会在一定程度上减少MySQL专有语法但不要报太大希望导出的文件仍需人工改造。然后把文件传到达梦服务器上用disql执行cd /dm8/bin ./disql SYSDBA/SYSDBAlocalhost:5236进入disql后先设置字符集为UTF-8SET CHAR_CODE UTF8;再执行SQL文件START /tmp/dbname.sql;执行过程中disql会输出每条SQL的执行结果遇到报错会继续执行并提示错误行号。导入完成后重点检查那些报错的表手工修复语法问题后单独补导。导出的SQL文件在达冬里执行时最需要改造的几类语法反引号、ENGINEInnoDB AUTO_INCREMENTxx DEFAULT CHARSETutf8mb4这类表选项、MySQL的int(11)显示宽度、AUTO_INCREMENT自增列。反引号可以直接用sed批量删除sed -i s///g dbname.sqlAUTO_INCREMENT在达梦里对应的是IDENTITY自增列如果建表语句里已经带上了AUTO_INCREMENT需要手动改为CREATE TABLE t_user ( id INT IDENTITY(1,1), name VARCHAR(100) );这个方案的优点是零额外依赖缺点是SQL文件大的时候文本改造很折磨人。适合数据量不大几百MB以内、表结构不算复杂的场景。4.2 方案二Navicat Premium数据传输如果你手上有Navicat Premium 16或更高版本可以直接用它连接达梦数据库。Navicat从16.x版本开始支持达梦数据库连接类型不需要额外装驱动在新建连接界面选择“达梦数据库”即可。具体操作步骤在Navicat里分别新建MySQL连接和达梦数据库连接确认两者都能连通。在MySQL数据库上点击右键选择“数据传输”。弹出窗口里目标库选达梦数据库连接选择对应的数据库/模式。勾选需要迁移的表、视图、函数等对象点击“开始”。Navicat的数据传输会将源库的表结构和数据自动转换成目标库语法生成的DDL是达梦风格的不需要手动改建表语句。数据类型的自动映射做得也不错MySQL的int、varchar、datetime、text这些常规类型都能正确对应到达梦类型。这个方案很适合中小规模的库操作简单直观。但遇到超大表比如几千万行时数据传输可能会比较慢建议在业务低峰执行。另外如果MySQL里有大量JSON、enum等特殊类型Navicat可能无法正确映射需要提前把这类字段改成varchar或text。4.3 方案三Kettle ETL批量同步Kettle也叫PDIPentaho Data Integration是目前用得比较多的开源ETL工具。它支持通过JDBC连接MySQL和达梦适合数据需要清洗转换、或者要做周期性增量同步的场景。开始前需要把达梦的JDBC驱动放到Kettle的lib目录下。达梦驱动一般位于数据库安装目录的drivers/jdbc子目录文件名类似DmJdbcDriver18.jar。cp /dm8/drivers/jdbc/DmJdbcDriver18.jar /opt/data-integration/lib/然后在Kettle里新建数据库连接。因为Kettle自带的连接类型里没有直接列“达梦”需要选择“Generic database”通用数据库然后手动填入连接信息连接URLjdbc:dm://192.168.1.100:5236驱动类dm.jdbc.driver.DmDriver用户名SYSDBA密码安装时设置的口令配置好后创建一个转换MySQL表输入经过字段选择或值映射最终到达梦表输出。表输出时Kettle支持自动建表但自动生成的DDL有时不符合预期尤其是字段注释、默认值这些细节我一般习惯手动在达梦里先建好目标表Kettle只负责数据搬运。关于性能达梦批量提交时表现不错建议每批提交数量设在2000到5000条之间不要太小也别太大。我在实际测试中发现5000条一批比100条一批总耗时能少一半以上。4.4 方案四自己写JDBC同步程序如果团队里有开发人员而且这次迁移是一次性大批量操作或者后续需要自动化重复迁移直接用Java写一个小工具是最可控的。核心思路是分别用JDBC连接MySQL和达梦读取源表结构转换为达梦DDL然后分页读取数据批量写入。示例代码框架Class.forName(com.mysql.cj.jdbc.Driver); Class.forName(dm.jdbc.driver.DmDriver); try (Connection mysqlConn DriverManager.getConnection(mysqlUrl, user, pass); Connection dmConn DriverManager.getConnection(dmUrl, sysdba, pass)) { // 读取MySQL表结构转为达梦DDL // 在dmConn上执行建表SQL // 分页查询源表每次1000条 // 使用PreparedStatement批量插入达梦目标表 }从information_schema.columns里读取MySQL字段信息转换字段类型的规则就是我后面章节那张映射表。独有细节是MySQL的auto_increment要转换成达梦的IDENTITYdatetime转换成TIMESTAMPjson转成CLOB或达梦JSON类型。这个方案的优点是完全可控可以断点续传可以记录日志失败重跑也方便。缺点是开发量不小只适合数据量大、需要长期维护的迁移场景。4.5 四种方案对比方案适用场景前提改动量稳定性mysqldump disql单次全量、数据量小有命令行列权限需手工改造SQL中等语法坑多Navicat数据传输中小库、图形界面操作Navicat Premium 16几乎零改造高自动映射好Kettle ETL复杂转换、增量同步服务器上有Kettle环境需写转换流程高性能可控自研JDBC程序超大批量、自动化开发人员开发成本大最高完全可控5. 迁移执行中真正耗时间的细节工具选好了不代表迁移就顺利。下面这些细节才是实际项目中真正耗时的地方每一项我都踩过坑。5.1 数据类型映射表MySQL和达梦的数据类型不是一一对应的。DTS或Navicat能自动处理大部分映射但手动写SQL、写程序时就需要明确的转换规则。这是我常用的映射表MySQL类型达梦类型建议备注int / integerINT去掉显示宽度如int(11)bigintBIGINT直接对应smallintSMALLINT直接对应tinyintSMALLINT需根据业务确认是否可转BOOLEANvarchar(n)VARCHAR(n)直接对应char(n)CHAR(n)直接对应datetimeTIMESTAMP建议转TIMESTAMPtimestampTIMESTAMP直接对应dateDATE直接对应timeTIME直接对应text / longtextTEXT 或 CLOB达梦里CLOB更通用blob / longblobBLOB直接对应注意大对象参数decimal / numericDECIMAL(p,s)按原精度处理float / doubleFLOAT / DOUBLE直接对应jsonVARCHAR / CLOB达梦新版有JSON类型老版本建议用CLOBenum / setVARCHAR CHECK约束彻底转成常规类型最省心auto_incrementIDENTITY(1,1)自增列的达梦实现方式在实际项目中最容易被漏掉的是tinyint(1)。MySQL里tinyint(1)经常被当布尔值用但在达梦里没有完全对应的布尔类型需要根据业务逻辑决定转成SMALLINT还是CHAR(1)。5.2 字符集与编码问题达梦数据库导入时字符集问题是一个高频坑。如果你在导入或迁移过程中遇到类似“本地编码:pg_gbk导入文件编码:pg_utf8”的提示本质就是客户端环境的编码和文件编码不一致。解决的基本原则是源库、导出文件、目标库三者统一字符集。推荐的做法MySQL导出时强制使用--default-character-setutf8mb4确保导出文件是UTF-8编码。达梦数据库建库时选择UTF-8字符集。如果已经建好了且选的是GBK可以考虑新建一个UTF-8的库或者转换后再导入。在disql里导入之前先执行SET CHAR_CODE UTF8;。导入工具或程序连接达梦时JDBC连接URL里也要带上字符集参数。我见过太多人因为字符集不一致导完数据后中文全部变成问号最后又要重导一遍。这个检查一定放在迁移开始前比事后补救高效得多。5.3 大表迁移的卡死、超时与中断恢复几千万行的表一次性导入很容易卡死或超时。不管用哪种迁移方案大表迁移都需要做几个预设动作目标端先禁用约束和索引。数据导入完成后再重建索引速度会有数量级的提升。分批提交。DTS里一般有批量提交设置Kettle里可以设置Commit Size自己写程序时可以按主键范围切片。提前规划断点续传。如果整个表导入中途失败不要从头再跑。按ID区间或日期字段切片每一批记录进度失败后从上一批末尾继续。举一个实际例子我之前迁移一张一亿行的流水表直接用DTS全表迁移跑了两个小时直接超时断开数据全部回滚。后来改成按月份切片每次只迁一个月的量每批提交成功后记下月份最终四十分钟跑完而且中途失败只重跑失败的月份省力太多。5.4 迁完之后的核对清单迁移完成不代表结束核对是最后一道关卡。我每次迁移完都会按下面这个清单逐项检查表数量一致源库和目标库分别统计表数量确认没有遗漏。大表行数一致每张超过百万行的表执行count(*)对比总量。自增初始值一致达梦的IDENTITY从哪个值开始要和MySQL的AUTO_INCREMENT当前值对齐否则后续插入会撞主键。索引和主键完整确认目标库每个表的主键、唯一索引都已重建。应用连接串已切换达梦的JDBC驱动类名是dm.jdbc.driver.DmDriverURL格式是jdbc:dm://IP:5236驱动jar包放在应用lib目录下。核心业务SQL冒烟测试找几条查询量大的SQL在达梦上执行确认结果集和MySQL一致。我自己在项目中还养成了一个习惯迁移前先迁一张小表把整条链路跑通确认字符集、类型映射、连接配置都没问题再迁大表而不是直接拿最大的表试错。最后分享一个经验达梦迁移工具没有MySQL选项大概率不是达梦不能迁MySQL而是你手里的版本或安装包不完整。先修工具再谈替代方案这个顺序不要搞反。工具修好之后DTS的批量执行和错误日志能力确实比大多数第三方方案更省心。但无论如何迁移开始之前目标端做好备份、准备好一条不需要图形界面的备用迁移路线这两件事都不会白做。