简介:数据库迁移是系统架构演进与国产化替代中的关键环节,其核心在于理解异构数据源之间的对象解析、数据传输与装载机制。以达梦数据库为例,DTS、DMHS、dmfldr等迁移工具各有适用边界,选型需结合网络链路、客户端环境与源端类型综合判断。迁移前的初始化参数设定,如页大小、字符集、大小写敏感等选项,在建库后无法修改,直接影响后续性能与兼容性。通过合理的表空间规划、redo配置及驱动匹配,可有效规避常见错误。该思路广泛适用于信创替代、业务上云、异构库搬迁等场景,帮助工程师在动手前规避风险,并在报错时快速定位根因。本文围绕达梦数据库迁移,系统梳理全流程关键点,为DBA与实施人员提供可落地的操作指引。
1. 达梦数据库数据迁移:一份带坑位的作战清单,比向导更值钱
达梦数据库数据迁移这件事,最反直觉的结论是:绝大多数迁移失败不是发生在 DTS 工具运行期间,而是在迁移前没人确认源端数据库类型、网络链路和驱动版本。这份材料是达梦官方对数据迁移方式的实操梳理,覆盖迁移前调研、工具选型(DTS / DMHS / dmfldr)、初始化参数设定、常见报错处理四个环节。适合正在做信创替代、异构库搬迁的 DBA 和实施工程师——它告诉你怎么在动手前把链路选对,以及报错时从哪个方向排查,而不是对着 DTS 界面干瞪眼。
2. 迁移前调研:弄清源端类型、网络链路与运行条件的五个检查点
2.1 项目背景五问:范围、时间、性能目标、风险先谈清楚
接手一个迁移任务,别急着装工具,先把下面五个问题问完:移植范围是只搬数据库对象和数据,还是要连应用一起做功能、性能测试;移植时间是否包含环境准备;有没有设定移植后的性能目标;移植后需要做哪类测试;整体风险评估怎么评。这些问题看着像项目管理话术,实际每个都直接改变技术方案。如果只搬数据库,DTS 一把梭就行;如果还要做性能测试,就得把表空间布局、redo 大小、归档目录一起规划进去,测试环境标准和正式环境拉平。特别是风险评估里那条「移植过程是否存在大量改动」,基本上决定了你是选 DTS 直迁,还是先过一遍中转库再进达梦。
实际操作中,我一般会把「移植测试」单独圈出来问仔细。功能测试好理解,性能测试要的是迁移后跑批不慢、并发不抖,可靠性测试要的是故障切换和重启后数据完整。这三个目标对应完全不同的迁移策略:只做功能测试,DTS 默认配置够用;要做性能测试,初始化参数必须先定准(后面第 4 章展开);要做可靠性测试,归档日志目录和备份策略在迁移当天就得就位。所以调研不是走流程,是把后续一个月的坑提前到今天来排。
2.2 源端数据库类型:先确认 DTS 认不认,再谈迁移
源端数据库类型必须放在第一个确认。DTS 对 Oracle、MySQL、SQLServer、DB2 这些主流库支持得比较好,但对少见的库支持有限。材料里特意点了 MariaDB——用 DTS 迁 MariaDB 报错率很高,建议通过中间库中转,具体链路是 MariaDB 先迁到 MySQL,再从 MySQL 迁到达梦。
为什么绕这一圈?DTS 获取源端元数据和 DDL 时,对 MySQL 的方言兼容做得更成熟,而 MariaDB 某些 DDL 写法、默认值表达式和存储引擎细节会让 DTS 的 DDL 解析阶段直接翻车。既然 DTS 转换不了,你手工改 DDL 的工作量会巨大,不如先用 Navicat 把 MariaDB 导到 MySQL,花十几分钟搭个跳板,后面全程用 DTS 走标准链路。另外,Oracle 迁移到达梦的场景,如果源端是 Oracle 且数据量不大,可以先把表导出成文本文件,再用 Navicat 连接达梦做导入,这也是材料里明确写过的一条路。
2.3 网络链路判定:不通和通,是两套完全不同的方案
网络场景是迁移方案的第一分流器。两端网络不通时,材料给了两条路:一是在源端临时部署一套同样版本的达梦数据库,初始化参数和正式环境保持一致,先把数据迁到临时环境,再通过备份还原或导出导入搬到正式环境;二是把数据导成 txt 或 Excel 文件,拷贝到达梦服务器,用 dmfldr 或 DTS 导入。
这里有一个在实施中经常被忽略的细节:如果正式环境是集群,选择物理备份还原的话需要重搭集群,数据量不大时优先导出 dmp 包再导入。我见过不止一次,有人图省事直接拿临时库的物理备份往集群上还原,结果集群成员状态对不上,最后花一晚上重搭集群。两库网络相通时,判断链就变成了:有没有客户端机器 → 客户端和两端带宽如何 → 目的端服务器有没有图形化桌面 → 防火墙是否开放。四个条件逐项过,缺一个 DTS 就跑不顺。
下面把网络场景和推荐方案整理成一个速查表,实施时可以照着定:
| 网络场景 | 推荐方案 | 限制条件 |
|---|---|---|
| 网络不通 | 临时达梦库中转或导文件用 dmfldr 导入 | 集群场景物理备份还原需重搭集群 |
| 通,有客户端,带宽好,有图形桌面 | DTS 直迁 | 源端类型必须 DTS 支持 |
| 通,有客户端,带宽差或服务器无桌面 | DMHS 迁移 | 源端需 DMHS 支持,不支持则导文件 |
| 通,但存在防火墙限制 | 放通端口走 DTS,或改用文件导入 | 防火墙策略需要提前联系网络管理员 |
2.4 客户端机器、带宽与图形化桌面:DTS 是 GUI 工具,没桌面就是白搭
DTS 是图形化工具,这个属性直接决定了它对运行环境的要求。材料里那句「有客户端机器且网络带宽等都符合要求」是 DTS 使用的硬前提,拆开看有三层:客户端机器要能同时连源端数据库和达梦数据库;客户端到两端的链路带宽要撑得住全量数据抽取;目的端服务器最好有图形化桌面,否则 DTS 界面起不来。
最容易踩坑的是「有客户端机器但是网络带宽较差」的场景。我在项目里遇到过几次,客户端离源端数据库很近,但离达梦服务器跨了专线,带宽只有几 Mb,DTS 抽数据时界面看着在跑,实际速度感人,一个两千万行的表跑了十几个小时。这种场景材料里的建议很明确:网速不好且服务器没有图形化桌面时,改用 DMHS 迁移。DMHS 是日志级同步工具,增量数据走日志捕获,对带宽消耗比 DTS 全量抽取低一个量级。同时也要确认源端是否 DMHS 支持的类型,如果 DMHS 不支持,就回到「导出文件 + 快速装载」的路线上,用 dmfldr 在服务器本地命令行导入,不依赖图形界面。
3. 迁移工具选型:DTS、DMHS、文件导入各自守哪一段
3.1 DTS 迁移原理:五步链路,错在哪一步有章可循
DTS 迁移原理拆开是五步:获取源端 DDL → 解析 DDL 并转化为达梦支持的 DDL 语句 → 在达梦数据库中执行 DDL → 获取源端数据 → 传输到目的端并装载。理解这五步,你就知道报错信息对应哪个环节。第一步和第二步最容易出问题,因为源端方言千差万别,特别是触发器、包、自增列默认值这类对象,解析阶段稍不留神就失败。第三步也有坑,达梦执行 DDL 时如果对象依赖顺序不对,比如先建表后建视图的依赖没理顺,会出现对象不存在之类的连锁报错。
因此拿到一份迁移任务时,不要一上来就点 DTS 的「下一步」,而是先在源端把核心表的 DDL 拉出来人工扫一眼。比如 MySQL 的表如果有ON UPDATE CURRENT_TIMESTAMP这类达梦解析器处理不友好的默认值,提前在源端改掉或者准备替换语句,比等 DTS 报错再回头查快得多。
3.2 DTS 适用场景与硬约束:有客户端、带宽好、能连两端
DTS 适合的场景可以总结为三个条件同时满足:源端类型在 DTS 支持列表里、有客户端机器能连通两端、两端之间带宽足够。三条不满足任何一条,我都不建议硬上 DTS。
具体来说,源端是 Oracle 或 MySQL 时 DTS 最省心,出错点集中在驱动和少量方言;源端是 SQLServer 或 DB2 时,要注意数据类型映射差异,比如datetime2到达梦后的精度变化、nvarchar(max)的映射选择,这些在迁移完成后要做一轮比对。另外材料里专门提醒了一点:DTS 跑批时如果报「系统错误」「分析失败」,大概率是驱动不对或者 DTS 版本不对,更换源端 JDBC 驱动并指定 URL 是最快的尝试路径,驱动要从源端数据库环境里拷贝对应版本,别从网上随便下。
3.3 DMHS:带宽差、没图形桌面时的另一个选择
DMHS 的定位是异构数据库同步工具,材料里给出的切入场景很具体:客户机(使用 DTS 的机器)和服务器之间网速不好,并且服务器没有安装图形化桌面。这种组合下 DTS 跑不动,DMHS 通过日志捕获方式做数据同步,对带宽要求低得多,而且日常运维走命令行和配置文件,不依赖 GUI 环境。
但 DMHS 也有自己的前提:源端数据库得是 DMHS 支持的类型。如果你的源端是某个小众数据库,DMHS 不支持,就得把源端数据导出到文件,再走快速装载方式迁移。所以选型逻辑是递进的:先看 DTS 能不能用,不能用再看 DMHS 支不支持源端类型,再不行就导文件 + dmfldr,这条路虽然土但所有数据库都走得通。
3.4 中转链路:MariaDB 先入 MySQL、Oracle 文本文件用 Navicat
材料里两个中转案例值得单独说。第一个是 MariaDB 到达梦:因为 DTS 对 MariaDB 的 DDL 解析经常翻车,材料建议用 Navicat 把 MariaDB 先迁到 MySQL,再从 MySQL 迁到 DM。实际操作中,Navicat 的数据传输功能走 JDBC,处理常见类型映射比 DTS 对 MariaDB 的兼容性更好,两个 MySQL 系库之间迁一遍几乎零成本,换来的却是后面 DTS 链路的稳定。第二个场景是 Oracle 导成文本文件,通过 Navicat 入达梦——适合数据量适中、表结构相对简单、对字段精度要求可控的场景。注意文本导入前要确认分隔符、日期格式、空值表示三个约定,否则导入完成才发现日期列全错了,回头清理很痛苦。
4. 正式迁移前的环境准备:初始化参数、磁盘规划与表空间设计
4.1 dminit 初始化参数:页大小、簇大小、字符集、大小写敏感定下来就不能反悔
达梦实例初始化时有一组参数在建库后无法修改,改只能重建实例,这就是迁移项目里最大的「后悔药」环节。材料里明确列出五个关键项:页大小、簇大小、字符集编码、大小写敏感、VARCHAR 类型对象的长度是否以字符为单位。这五个参数必须在建库前根据源库特性定准,我一般会在初始化前用下面这组命令:
# 达梦初始化实例,关键参数一旦确定后期无法修改 ./dminit PATH=/dmdata/data/DMDB \ PAGE_SIZE=16 \ EXTENT_SIZE=32 \ CHARSET=1 \ CASE_SENSITIVE=Y \ LENGTH_IN_CHAR=1参数说明:
PATH指定实例存放路径,对应第 4 章后面说的磁盘规划,路径本身要提前挂好并确认空间。PAGE_SIZE页大小,取值 4/8/16/32(单位 KB),页越大对批量导入和大表扫描越友好,但资源开销也高,源端数据量在 TB 级时通常选 16 或 32。EXTENT_SIZE簇大小,即每次分配空间的单位,和页大小配合决定表和索引的存储效率,规则场景下 32 够用。CHARSET字符集,0 为 GBK,1 为 UTF-8。源端有中文数据时我建议用 UTF-8,避免后续应用连接时字符集转换出乱码。CASE_SENSITIVE大小写敏感,Y/N 二选一。这个参数影响最大——源端 Oracle 如果建表用了带引号的小写表名,达梦这边大小写敏感设为 N 时会出现标识符匹配问题,反过来如果源端是 MySQL 的lower_case_table_names=0场景,也要对应调整,务必在迁移前确认源端标识符规则。LENGTH_IN_CHARVARCHAR 长度是否以字符为单位,1 表示按字符计算,和 Oracle 的习惯一致,源端是 Oracle 时建议置 1,否则按字节算,中文字段长度会差三倍,迁移后某些列会莫名超长报错。
4.2 INI 参数与兼容模式:COMPATIBLE_MODE=2 做了什么
初始化实例之后,还要调整 INI 参数和兼容性参数。材料里给的 COMPATIBLE_MODE=2 是达梦的兼容模式开关:0 为不兼容,1 为兼容 Oracle,2 为兼容 MySQL。源端如果是 MySQL,设为 2 可以让达梦在语法解析、数据类型转换、系统函数行为上尽量贴近 MySQL,减少应用层改造量。源端是 Oracle 的项目则把 COMPATIBLE_MODE 设为 1。逻辑很简单:目标库的兼容模式跟着源端主库走,应用代码改动最小。
除兼容模式外,INI 参数里还有一组需要根据源库负载调的,比如最大连接数、缓冲区大小、并行度等。材料提供的参考做法是「参考参数自动优化脚本」,也就是用达梦自带的脚本按硬件资源自动生成一套配置基线,再在这个基线上按业务微调。我自己的习惯是:memory_target 和 buffer 相关参数按机器物理内存的百分比给,不要用默认值硬扛,否则迁移完压测时第一个瓶颈必然是缓冲区。
4.3 磁盘目录规划:/dmdata、/dmarch、/dmbak、/dmdb 各司其职
磁盘规划是迁移前最容易嫌麻烦、迁移后最容易后悔的环节。材料里给出的目录划分是达梦项目里通用的做法:数据文件放 /dmdata,归档日志放 /dmarch,备份文件放 /dmbak,程序文件放 /dmdb。四个目录建议落在不同挂载点或 RAID 组上,避免数据写入和归档写入抢同一块磁盘的 IO。
安装前让集成商挂好磁盘并做好 RAID 是硬性要求,这块别省。实际操作中我见过因为磁盘没挂到位、安装到一半空间不足的案例,迁移节奏全被打乱。目录规划的同时还要预估容量:数据文件按源库实际大小的 1.5 到 2 倍预留,归档目录按每天归档量乘以保留天数估算,备份目录至少要能放下两份全备。这些都算清楚后,把目录清单写进实施方案,让服务器管理员一次性配齐。
4.4 表空间、用户与 redo:别把数据迁到 SYSDBA 和 MAIN 下
材料里有两条纪律值得反复强调:预先创建表空间并根据数据量提前分配数据文件,同时扩大 redo 到 2G;创建新用户并显式指定数据表空间和索引表空间,不允许把数据迁到 SYSDBA 用户下和 MAIN 表空间下。
-- 创建数据表空间和索引表空间,按预估容量提前分配 CREATE TABLESPACE TS_DATA DATAFILE '/dmdata/data/DMDB/ts_data01.dbf' SIZE 2048; CREATE TABLESPACE TS_IDX DATAFILE '/dmdata/data/DMDB/ts_idx01.dbf' SIZE 1024; -- 创建业务用户,强制绑定数据表空间和索引表空间 CREATE USER APP_USER IDENTIFIED BY "Password123" DEFAULT TABLESPACE TS_DATA INDEX TABLESPACE TS_IDX;为什么不建议用 SYSDBA 和 MAIN?迁移到 SYSDBA 用户下,所有表都堆在系统用户里,后续权限管理、资源隔离、备份恢复都别扭;MAIN 是系统默认表空间,和系统字典混在一起,数据膨胀后维护困难。更关键的是,达梦的备份还原是按表空间和用户维度组织的,业务数据独立用户和独立表空间后,后续做表空间级备份、用户级迁移都顺理成章。创建用户的 SQL 里显式指定了 DEFAULT TABLESPACE 和 INDEX TABLESPACE,表数据和索引数据物理分离,这在源端数据量大时对查询性能有明显帮助。
redo 日志扩到 2G 也是迁移前必做项。默认的 redo 文件偏小,DTS 大批量装载时产生的日志量会频繁触发日志切换,拖慢整体装载速度,极端情况下还会报日志空间不足。扩 redo 的操作在迁移前做,零风险;迁移中再做,就得停服务,白白增加变更窗口。
5. DTS 迁移常见问题与避坑:驱动、版本与「表迁移成视图」三座山
5.1 系统错误、分析失败:九成是 JDBC 驱动或 DTS 版本不对
现象:DTS 点击开始迁移后,很快弹出「系统错误」或「分析失败」,任务中断,日志里看不到具体 SQL。
原因:绝大多数情况是源端 JDBC 驱动版本不匹配,或者 DTS 版本本身和源端数据库兼容性差。DTS 在获取源端 DDL 时通过 JDBC 驱动读取元数据,驱动太老拿不到新版本数据库的元数据字段,驱动太新又可能和 DTS 内部解析器冲突。
解决:换驱动是第一步。Oracle 场景下从源端数据库安装目录直接拷贝对应版本的 JDBC 驱动,比从网上下载更可靠;MySQL 场景装好 MySQL Community Connector/J 后,在 DTS 配置里手工指定驱动文件并写好 JDBC URL,可以绕过自动检测的坑。如果换驱动还不行,直接换 DTS 版本,材料里提到有时 DM7 的老版本 DTS 比新版还稳,建议电脑里多备份几个 DTS 版本。
5.2 DTS 版本悖论:旧版本有时比新版更稳
现象:同样的源库、同样的驱动配置,新版 DTS 报「分析失败」,换个旧版本反而全量迁完。
原因:DTS 版本更新通常伴随对更多数据库方言的支持,但兼容性的提升是此消彼长的——新版本对某类源库的解析器改动,可能引入针对新特性的判断逻辑,而老版本的处理方式恰好更宽松。材料里点名了这一点:「有时候老的 DM7 的版本相对于最新版本的 dts 还稳定点」。
解决:本地多留存几个 DTS 版本,接到迁移任务时先拿一张小表试迁,确认当前版本和源端组合没问题再上全量。我电脑里常年保留两到三个 DTS 版本,尤其是源端是 MySQL 系和 SQLServer 系的项目,试迁成本极低,值得每次先花十分钟验证。
5.3 表迁移成视图:MariaDB 的典型症状,先入 MySQL 再入 DM
现象:迁移完成后检查目标端,发现某些「表」变成了视图,数据丢失或错乱。
原因:这是迁 MariaDB 时比较典型的问题。MariaDB 某些表定义在 DTS 解析时被误判为视图——通常是源端表带有特殊存储引擎属性、或者 DDL 里包含 DTS 解析器不认识的子句,导致对象类型识别错误。材料里说这种现象「在迁移 mariadb 的时候会出现这种情况」。
解决:按材料里给的链路走——先在源端用 Navicat 把 MariaDB 迁到 MySQL,再从 MySQL 迁到达梦。两个 MySQL 系库之间的结构转换由 Navicat 完成,天然规避了 DTS 对 MariaDB 的解析缺陷。如果已经迁移完成才发现表变成视图,不用全量重来,可以在源端手工把报错的表导出成文件,单独处理后用 dmfldr 补进目标库。
5.4 各源端获取 DDL 的标准姿势:Oracle、MySQL、SQLServer、DB2 各一套
现象:需要手工核对源端表结构或补迁某张报错表时,不知道从哪个系统视图或函数拿 DDL。
原因:各数据库获取 DDL 的方式完全不同,材料里做了汇总,这里直接列出来。Oracle 通过DBMS_METADATA.GET_DDL获取,需要指定类型、对象名和 schema:
-- Oracle 获取建表 DDL SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEE', 'APP_USER') FROM DUAL;MySQL 最简单,SHOW CREATE TABLE一行搞定:
-- MySQL 获取建表 DDL SHOW CREATE TABLE employee;SQLServer 要通过sysobjects和syscolumns两张系统表组合查询拼 DDL,DB2 则用metadata.getTables(null, "%", null, names)这组 API 走应用层拿元数据。
掌握这四个来源后,DTS 在第二步解析出错时就能快速从源端手工拉 DDL,把转换不了的语句单独改造后再回填进迁移流程。材料里的原话是「要知道如何获取源端 DDL,然后针对性的解决问题」,这句话是排错的核心思路——DTS 只是个执行框架,真正解决问题的是你对源端结构的理解程度。
6. 迁移收尾:DTS 配置细节、驱动匹配与一条迁移后校验链
6.1 DTS 参数配置的几个关键项
DTS 界面里的参数看着多,真正影响迁移质量的集中在三处:源端 JDBC 驱动及 URL、批量提交大小、错误处理策略。驱动和 URL 决定能不能连上、解析对不对;批量大小决定装载速度,默认值保守,数据量大时可以按源库负载适当调大;错误处理建议选「记录日志并继续」,不要让单表报错中断整个任务,跑完再看日志统一处理。
6.2 Oracle 驱动与 JDK 版本对应表
Oracle 场景下驱动选错是迁移失败的高频原因,材料里给了完整对应关系:
| 驱动文件 | 对应 JDK 版本 | 适用数据库版本 |
|---|---|---|
| classes11.jar | JDK 1.1.x | 极老环境,基本遇不到 |
| classes12.jar | JDK 1.2 / 1.3 | Oracle 8i / 9i |
| ojdbc14.jar | JDK 1.4 / 5.0 | Oracle 9i / 10g |
| ojdbc5.jar | JDK 5.0 | Oracle 10g / 11g 早期 |
| ojdbc6.jar | JDK 6.0 | Oracle 11g(最常见组合) |
| ojdbc7.jar | JDK 7.0 | Oracle 12c |
| ojdbc8.jar | JDK 8.0 | 目前主流 |
判断依据很简单:先看达梦客户端和 DTS 自身跑在哪个 JDK 版本上,再选对应驱动文件,从源端数据库安装目录拷贝原版驱动,不要从第三方站点下载改动过的 jar 包。
6.3 迁移后校验链:连接、行数、抽样、对象四步走
迁移完成不等于结束,DTS 日志显示成功只代表装载过程无报错。我的校验习惯固定是四步:先用 Navicat 连接达梦数据库做一轮冒烟查询,确认端口和服务正常;再按大表清单逐张比对源端和目标端行数,这个步骤建议写成 SQL 脚本批量跑,不要手工一张张数;然后对每张大表按主键或唯一键抽样 1000 条,比对关键字段的值和类型;最后查一次对象清单,确认触发器、序列、视图、存储过程的数量和源端一致。
从那以后,我每接到一个达梦迁移任务,都会强制先走一遍这套流程:确认源端类型和驱动、画清网络拓扑、拿小表试迁验证 DTS 版本、把初始化参数和目录规划写死在方案里,再进行全量迁移,最后用 Navicat 连上达梦按四步校验收尾。顺序不能乱,调研省掉的每一分钟,都会在迁移当天加倍还回来——这套顺序救过我很多次,希望帮到你。
本文还有配套的精品资源,点击获取