当前位置: 首页 > news >正文

Oracle11g数据库迁移达梦8数据库方案

✅ 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 驱动ojdbc8DmJdbcDriver18.jar
SpringBoot2.x✅ 支持
JDK8✅ 兼容

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 类型达梦等价注意事项
NUMBERDECIMAL/NUMERIC长度必须明确,避免默认
VARCHAR2VARCHAR无需改动
CLOB/BLOBCLOB/BLOB类型兼容但函数不同
DATEDATE/TIMESTAMP达梦默认是 yyyy-MM-dd HH:mm:ss
SEQUENCESEQUENCE名称和调用方式一致,但自增 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)

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

✅ 技术注意点

  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)✅ 支持,推荐显式声明精度
NUMBERDECIMAL(38,0)❗默认精度可能不一致,建议显式声明
DATEDATE✅ 支持,精度为到秒
TIMESTAMPTIMESTAMP[(p)]✅ 支持,精度可调
CLOBCLOB✅ 支持大文本,部分函数不同
BLOBBLOB✅ 支持二进制,适配函数需测试
LONGTEXT(建议)❗Oracle 遗留类型,建议迁移为 CLOB
RAW / LONG RAWBINARY(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 值

🧱 三、表结构与数据库特性对比

功能/对象OracleDM8 支持差异说明
自增主键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 特有分页写法。
http://www.dtcms.com/a/307039.html

相关文章:

  • Python序列化和反序列化
  • 如何用Docker部署ROS2
  • (C++)C++类和类的方法(基础教程)(与Python类的区别)
  • c++之基础B之sort排序(第三个参数没有)(第二课)
  • Fiddler中文教程 从入门到进阶的网络抓包与接口调试实战指南
  • Python Pandas.merge_asof函数解析与实战教程
  • VUE前端
  • [Agent开发平台] API网关 | 业务领域 | DTO格式 | 分页令牌
  • React 服务端渲染(SSR)详解
  • 使用 cron 配合 Docker 实现定时任务
  • 神经网络的并行计算与加速技术
  • 模型相关类代码回顾理解 | BatchNorm2d\fc.in_features\nn.Linear\torchsummary
  • Haproxy 七层代理深度解析
  • Ubuntu 本地部署和使用 n8n 指南and ai almost anything
  • REST、GraphQL、gRPC、tRPC深度对比
  • Python Day19 时间模块 和 json模块 及例题分析
  • Dify案例2:基于Workflow的小红书笔记AI智能体以及AI绘图过程中遇到的问题
  • USRP捕获手机/路由器数据传输信号波形(上)
  • Vue面试
  • HTML基础P2 | JS基础讲解
  • 《汇编语言:基于X86处理器》第10章 复习题和练习
  • HTTPS基本工作过程:基本加密过程
  • 谈谈毕业工作一年后的变化
  • c#_文件的读写 IO
  • 关系型数据库架构最优选择:基于落霞归雁思维框架的分析
  • 7月30日作业
  • Spring Boot 数据源配置中为什么可以不用写 driver-class-name
  • 第六章第一节 TIM 定时中断
  • vue2中的过滤器filter
  • 1+1>2!特征融合如何让目标检测更懂 “场景”?