Oracle11g数据库迁移达梦8数据库方案
✅ SpringBoot 项目从 Oracle 迁移至达梦数据库方案
🧭 一、迁移背景
由于 Oracle 数据库的商业授权费用高、受限于国产化政策或预算控制,越来越多的单位选择将 Oracle 迁移至国产数据库,如达梦(DM)。
📋 二、迁移内容范围
迁移内容主要包括:
- 数据库结构(表结构、索引、视图、触发器、存储过程、序列等)
- 数据本身(表数据迁移)
- 数据库连接驱动
- SpringBoot 配置项调整
- SQL语法适配
- MyBatis 或 JPA 的兼容性检查
- 系统测试验证
🧰 三、准备工作
1. 环境确认
项目 | Oracle | 达梦 |
---|---|---|
DB版本 | 11g/12c/19c | 建议用 DM8 或 DM7 最新版 |
JDBC 驱动 | ojdbc8 | DmJdbcDriver18.jar |
SpringBoot | 2.x | ✅ 支持 |
JDK | 8 | ✅ 兼容 |
2. 工具准备
-
达梦数据库客户端(DMC、工具包)
-
Oracle 客户端(或 SQLDeveloper)
-
数据迁移工具(可选):
- 达梦官方
dm8_expdp/dm8_impdp
- 第三方如:DTS、飞鲸、GoldenGate、Maxwell、DBConvert 等
- 自研脚本或 ETL 工具(如 DataX)
- 达梦官方
🚀 四、迁移步骤
步骤 1:备份原 Oracle 数据
- 使用
exp
/expdp
工具导出 DMP 文件 - 或使用 SQLDeveloper 导出为 SQL 脚本
- 建议先只导出结构再导出数据
expdp user/password directory=DATA_DIR dumpfile=full_export.dmp logfile=export.log full=y
步骤 2:初始化达梦数据库
- 创建对应的 schema、用户、表空间(达梦中叫“表空间组/模式”)
- 字符集建议设为:UTF-8(ZHS16GBK兼容性好)
create tablespace DM_TS datafile '/dmdata/dm_ts.dbf' size 256 autoextend on;
create user myuser identified by "password";
grant all privileges to myuser;
步骤 3:表结构迁移
✅ 推荐做法:
- 使用 Oracle 导出的 SQL 脚本进行手动修改后,在达梦执行
- 或使用 达梦数据库迁移工具 DMT
❗注意事项:
Oracle 类型 | 达梦等价 | 注意事项 |
---|---|---|
NUMBER | DECIMAL/NUMERIC | 长度必须明确,避免默认 |
VARCHAR2 | VARCHAR | 无需改动 |
CLOB/BLOB | CLOB/BLOB | 类型兼容但函数不同 |
DATE | DATE/TIMESTAMP | 达梦默认是 yyyy-MM-dd HH:mm:ss |
SEQUENCE | SEQUENCE | 名称和调用方式一致,但自增 ID 语法不同 |
TRIGGER/PROCEDURE | ✅ 支持 | 语法差异需人工处理 |
步骤 4:数据迁移
✅ 方式一:SQL 脚本插入(适合小型系统)
- 生成 insert 脚本 → 修改兼容 → 执行
✅ 方式二:DataX
"reader": {"name": "oraclereader"
},
"writer": {"name": "dmwriter"
}
✅ 方式三:官方工具 dmloader / dmimp
步骤 5:SpringBoot 配置修改
application.yml
修改示例:
spring:datasource:url: jdbc:dm://127.0.0.1:5236/DAMENGdriver-class-name: dm.jdbc.driver.DmDriverusername: myuserpassword: password
Maven 添加依赖:
<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.49</version>
</dependency>
或将官方提供的 DmJdbcDriver18.jar
放入本地仓库:
mvn install:install-file \-Dfile=DmJdbcDriver18.jar \-DgroupId=com.dameng \-DartifactId=DmJdbcDriver18 \-Dversion=8.1.1.49 \-Dpackaging=jar
步骤 6:SQL 语法检查与适配
手动或通过单元测试发现兼容问题
常见问题举例:
Oracle 写法 | 达梦不兼容问题 | 建议替代 |
---|---|---|
SYSDATE | 不识别 | 用 CURRENT_TIMESTAMP |
dual 表 | 不存在 | 改为 select 1 |
rownum | 不支持 | 用 limit 替代 |
函数 nvl | ✅ 支持 | 兼容 |
to_char() 格式不同 | 格式符略有差异 | 需对照修正 |
分页语法 | Oracle rownum | 达梦用 limit offset |
步骤 7:存储过程 / 函数 / 触发器调整
- 达梦 PL/SQL 支持程度较好,但有语法差异
- Oracle 的
%TYPE
,%ROWTYPE
,EXCEPTION
结构需测试适配 - 建议将 PL/SQL 逻辑迁移为 Java 逻辑(如业务层或 MyBatis SQL)
⚠️ 五、注意事项 & 风险点
✅ 技术注意点
- 字符集一致:避免乱码(建议统一为 UTF-8)
- NULL 与默认值处理:达梦可能更严格
- 自增字段建议使用达梦的
IDENTITY
或SEQUENCE
- 不支持的函数/表达式需手工修改
- 分布式事务支持能力不如 Oracle,需重新设计事务逻辑
🚨 风险点
风险 | 应对策略 |
---|---|
业务中大量使用 Oracle 特有 SQL | 全文扫描 + 单元测试暴露 |
存储过程复杂且依赖大量 Oracle 语法 | 建议替换为 Java 逻辑 |
ORM 不兼容(如 MyBatis generator) | 自定义 SQL 显式处理 |
导出/导入数据出错(类型不匹配) | 小批量验证 + 类型映射表 |
迁移后性能下降 | 加索引 + SQL 优化 + 执行计划分析 |
✅ 六、测试验证
- ✔ SQL 执行单元测试(可用 DBUnit、Flyway)
- ✔ 数据量级别对比(行数、字段)
- ✔ 各功能接口业务逻辑测试
- ✔ 性能对比(慢 SQL、全表扫描)
- ✔ 数据导出/导入的兼容性检查
📝 七、回退机制(建议有)
- 保留 Oracle 环境的备份
- 达梦写入和读取分开部署
- 初期使用数据双写或主写 Oracle + 从同步达梦策略
- 考虑使用版本化数据库管理(如 Liquibase / Flyway)
✅ 八、后续建议
- 编写《数据库兼容性手册》
- 建立 SQL 审核制度
- 引入监控工具监控慢 SQL、执行计划(达梦提供相关日志)
- 定期使用
ANALYZE TABLE
优化索引统计信息
你说得对,达梦数据库 DM8 从较早版本起确实内置了 DUAL
表,但其行为在某些细节上与 Oracle 有所差异。我们来重新、更加严谨地整理整个 Oracle → 达梦(DM8)迁移对照表,包括你提到的 DUAL、函数、类型等,并加上 “支持情况 + 特性说明”,方便项目中直接参考。
✅ Oracle → 达梦(DM8)迁移兼容性对照手册(完整版)
📦 一、数据类型映射表
Oracle 数据类型 | DM8 数据类型 | 说明与注意事项 |
---|---|---|
VARCHAR2(n) | VARCHAR(n) | ✅ 完全兼容,长度建议控制在 4000 以内 |
CHAR(n) | CHAR(n) | ✅ 完全兼容 |
NUMBER(p,s) | DECIMAL(p,s) 或 NUMERIC(p,s) | ✅ 支持,推荐显式声明精度 |
NUMBER | DECIMAL(38,0) | ❗默认精度可能不一致,建议显式声明 |
DATE | DATE | ✅ 支持,精度为到秒 |
TIMESTAMP | TIMESTAMP[(p)] | ✅ 支持,精度可调 |
CLOB | CLOB | ✅ 支持大文本,部分函数不同 |
BLOB | BLOB | ✅ 支持二进制,适配函数需测试 |
LONG | TEXT (建议) | ❗Oracle 遗留类型,建议迁移为 CLOB |
RAW / LONG RAW | BINARY(n) | ✅ 支持,需手动匹配长度 |
BFILE | ❌ 不支持 | 替代方案为 BLOB |
FLOAT(n) | FLOAT(n) | ✅ 支持,注意默认精度 |
📄 二、常用函数与表达式对照表
Oracle 表达式 / 函数 | DM8 是否支持 | 替代建议或说明 |
---|---|---|
SYSDATE | ✅ 支持 | 返回当前时间,类型为 DATE |
SYSTIMESTAMP | ✅ 支持 | 精度更高,类型为 TIMESTAMP |
NVL(a, b) | ✅ 支持 | 同功能 |
DECODE(a, b, c, ...) | ✅ 支持 | 同功能 |
TO_CHAR(date, 'YYYY-MM-DD') | ✅ 支持 | 格式化函数兼容 |
TO_DATE(...) | ✅ 支持 | 注意格式匹配 |
TRUNC(date) | ✅ 支持 | 日期截断函数兼容 |
ROUND(n, m) | ✅ 支持 | 数值保留小数 |
MOD(a,b) | ✅ 支持 | 求余数函数一致 |
ROWNUM | ❌ 部分支持 | 建议使用 LIMIT 或 TOP |
ROWID | ❌ 不兼容 | 达梦不支持此 Oracle 专属物理地址标识 |
DUAL | ✅ 支持(DM8+) | ✅ 可用于 SELECT 1 FROM dual |
INSTR , SUBSTR , LENGTH | ✅ 支持 | 字符串函数兼容 |
REGEXP_LIKE | ❌ 不完全兼容 | 可用 LIKE 、INSTR 替代 |
CASE WHEN | ✅ 支持 | 完全兼容 |
MERGE INTO | ✅ 支持(简化) | 兼容标准语法但功能不全,建议分解为 UPDATE + INSERT |
CONNECT BY 层级查询 | ✅ 支持 | 使用 START WITH ... CONNECT BY ,基本一致 |
SYS_GUID() | ✅ 支持 | 同 Oracle,返回 GUID 值 |
🧱 三、表结构与数据库特性对比
功能/对象 | Oracle | DM8 支持 | 差异说明 |
---|---|---|---|
自增主键 | SEQUENCE + trigger / IDENTITY | ✅ 支持 | DM8 支持 IDENTITY ,更推荐使用 |
触发器 | ✅ 支持 | ✅ 支持 | 语法略有差异(END; 后需 / ) |
视图(VIEW) | ✅ 支持 | ✅ 支持 | 同名视图、with check option 注意限制 |
存储过程 | PL/SQL 支持强 | ✅ 支持 | 兼容 Oracle 语法,存在细节差异 |
函数 | ✅ | ✅ | 需测试 return 类型是否兼容 |
索引 | ✅ 多种类型 | ✅ | B树支持,全文索引需手动开启 |
分区表 | ✅ | ✅ | 分区语法基本一致,测试必需 |
外键、主键 | ✅ | ✅ | 完全兼容 |
事务隔离级别 | READ COMMITTED 默认 | ✅ 支持 | 可设置 SERIALIZABLE 等 |
权限系统 | 细粒度角色权限 | ✅ | 支持用户、角色、授权控制 |
dual 表 | ✅ | ✅ | SELECT 1 FROM dual 完全兼容 |
🧪 四、分页写法对比(建议统一改造)
Oracle 写法 | 达梦推荐写法 |
---|---|
sql SELECT * FROM user WHERE ROWNUM <= 10 | ❌ 不推荐 |
Oracle 12c:FETCH FIRST 10 ROWS ONLY | ✅ 支持 |
推荐写法:SELECT * FROM user LIMIT 10 OFFSET 0 | ✅ 标准语法 |
✅ 总结建议
- DM8 已大幅提升兼容性,绝大部分 SQL、函数、数据类型可以平滑迁移;
ROWNUM
、REGEXP_LIKE
、部分 PL/SQL 特性仍需重点测试;- DUAL 表在 DM8 中是支持的,可以放心使用;
- 建议迁移前,使用工具扫描全库 SQL,形成兼容性分析报告;
- 若你使用 MyBatis,可以使用自定义分页插件替代 Oracle 特有分页写法。