> 技术文档 > Oracle11g数据库迁移达梦8数据库方案_oracle 达梦改造

Oracle11g数据库迁移达梦8数据库方案_oracle 达梦改造


✅ SpringBoot 项目从 Oracle 迁移至达梦数据库方案


🧭 一、迁移背景

由于 Oracle 数据库的商业授权费用高、受限于国产化政策或预算控制,越来越多的单位选择将 Oracle 迁移至国产数据库,如达梦(DM)。


📋 二、迁移内容范围

迁移内容主要包括:

  1. 数据库结构(表结构、索引、视图、触发器、存储过程、序列等)
  2. 数据本身(表数据迁移)
  3. 数据库连接驱动
  4. SpringBoot 配置项调整
  5. SQL语法适配
  6. MyBatis 或 JPA 的兼容性检查
  7. 系统测试验证

🧰 三、准备工作

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/DAMENG driver-class-name: dm.jdbc.driver.DmDriver username: myuser password: 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)

⚠️ 五、注意事项 & 风险点

✅ 技术注意点

  1. 字符集一致:避免乱码(建议统一为 UTF-8)
  2. NULL 与默认值处理:达梦可能更严格
  3. 自增字段建议使用达梦的 IDENTITYSEQUENCE
  4. 不支持的函数/表达式需手工修改
  5. 分布式事务支持能力不如 Oracle,需重新设计事务逻辑

🚨 风险点

风险 应对策略 业务中大量使用 Oracle 特有 SQL 全文扫描 + 单元测试暴露 存储过程复杂且依赖大量 Oracle 语法 建议替换为 Java 逻辑 ORM 不兼容(如 MyBatis generator) 自定义 SQL 显式处理 导出/导入数据出错(类型不匹配) 小批量验证 + 类型映射表 迁移后性能下降 加索引 + SQL 优化 + 执行计划分析

✅ 六、测试验证

  1. ✔ SQL 执行单元测试(可用 DBUnit、Flyway)
  2. ✔ 数据量级别对比(行数、字段)
  3. ✔ 各功能接口业务逻辑测试
  4. ✔ 性能对比(慢 SQL、全表扫描)
  5. ✔ 数据导出/导入的兼容性检查

📝 七、回退机制(建议有)

  • 保留 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 ❌ 部分支持 建议使用 LIMITTOP ROWID ❌ 不兼容 达梦不支持此 Oracle 专属物理地址标识 DUAL ✅ 支持(DM8+) ✅ 可用于 SELECT 1 FROM dual INSTR, SUBSTR, LENGTH ✅ 支持 字符串函数兼容 REGEXP_LIKE ❌ 不完全兼容 可用 LIKEINSTR 替代 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 ✅ 标准语法

✅ 总结建议

  1. DM8 已大幅提升兼容性,绝大部分 SQL、函数、数据类型可以平滑迁移;
  2. ROWNUMREGEXP_LIKE、部分 PL/SQL 特性仍需重点测试;
  3. DUAL 表在 DM8 中是支持的,可以放心使用;
  4. 建议迁移前,使用工具扫描全库 SQL,形成兼容性分析报告;
  5. 若你使用 MyBatis,可以使用自定义分页插件替代 Oracle 特有分页写法。

周公解梦