当前位置: 首页 > 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.lryc.cn/news/605110.html

相关文章:

  • 论文阅读|CVPR 2025|Mamba进一步研究|GroupMamba
  • 领域驱动设计(DDD)在分布式系统中的架构实践
  • cpp实现音频重采样8k->16k及16k->8k
  • 不同环境安装配置redis
  • 网络端口号全景解析:从基础服务到特殊应用的完整指南
  • 代码随想录算法训练营第三十六天
  • 【git】GitHub 的专用代理地址
  • day21-Excel文件解析
  • uvm-tlm-port-export-imp
  • 在VS2022中调试ASP.NET项目时修改DLL或ASPX动态页面的原理及实现方法
  • STM32CubeIDE新建项目过程记录备忘(二) GPIO输出demo:LED闪烁
  • 2025 IT专业人才培养趋势与职业发展指南:技术+数据复合型能力的构建路径
  • 【Kubernetes 指南】基础入门——Kubernetes 201(一)
  • OpenEuler 安装 apache + php8 不解析php文件的处理
  • 微信小程序中实现页面跳转的方法
  • Python奇幻之旅:从零开始的编程冒险
  • cpp-httplib 线程安全
  • mybatis中的极易出现错误用法
  • Chroma安装教程
  • uni-app webview的message监听不生效(uni.postmessage is not a function)
  • 明智运用C++异常规范(Exception Specifications)
  • 监测预警系统:让园区更高效、更安全、更智能
  • [Python] -进阶理解10- 用 Python 实现简易爬虫框架
  • Android Animation Transitions:打造流畅的用户体验
  • 性能优化(一):时间分片(Time Slicing):让你的应用在高负载下“永不卡顿”的秘密
  • vue模块化导入
  • DooTask教育行业功能:开启高效学习协作新篇章
  • 学习嵌入式第十五天
  • 【PostgreSQL内核学习:WindowAgg 帧优化与节点去重】
  • 李宏毅2025《机器学习》-第九讲:大型语言模型评测的困境与“古德哈特定律”**