Oracle11g数据库迁移达梦8数据库方案_oracle 达梦改造
✅ SpringBoot 项目从 Oracle 迁移至达梦数据库方案
🧭 一、迁移背景
由于 Oracle 数据库的商业授权费用高、受限于国产化政策或预算控制,越来越多的单位选择将 Oracle 迁移至国产数据库,如达梦(DM)。
📋 二、迁移内容范围
迁移内容主要包括:
- 数据库结构(表结构、索引、视图、触发器、存储过程、序列等)
- 数据本身(表数据迁移)
- 数据库连接驱动
- SpringBoot 配置项调整
- SQL语法适配
- MyBatis 或 JPA 的兼容性检查
- 系统测试验证
🧰 三、准备工作
1. 环境确认
DmJdbcDriver18.jar
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
❗注意事项:
NUMBER
DECIMAL/NUMERIC
VARCHAR2
VARCHAR
CLOB/BLOB
CLOB/BLOB
DATE
DATE/TIMESTAMP
yyyy-MM-dd HH:mm:ss
SEQUENCE
SEQUENCE
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 语法检查与适配
手动或通过单元测试发现兼容问题
常见问题举例:
SYSDATE
CURRENT_TIMESTAMP
dual
表select 1
rownum
limit
替代nvl
to_char()
格式不同rownum
limit offset
步骤 7:存储过程 / 函数 / 触发器调整
- 达梦 PL/SQL 支持程度较好,但有语法差异
- Oracle 的
%TYPE
,%ROWTYPE
,EXCEPTION
结构需测试适配 - 建议将 PL/SQL 逻辑迁移为 Java 逻辑(如业务层或 MyBatis SQL)
⚠️ 五、注意事项 & 风险点
✅ 技术注意点
- 字符集一致:避免乱码(建议统一为 UTF-8)
- NULL 与默认值处理:达梦可能更严格
- 自增字段建议使用达梦的
IDENTITY
或SEQUENCE
- 不支持的函数/表达式需手工修改
- 分布式事务支持能力不如 Oracle,需重新设计事务逻辑
🚨 风险点
✅ 六、测试验证
- ✔ SQL 执行单元测试(可用 DBUnit、Flyway)
- ✔ 数据量级别对比(行数、字段)
- ✔ 各功能接口业务逻辑测试
- ✔ 性能对比(慢 SQL、全表扫描)
- ✔ 数据导出/导入的兼容性检查
📝 七、回退机制(建议有)
- 保留 Oracle 环境的备份
- 达梦写入和读取分开部署
- 初期使用数据双写或主写 Oracle + 从同步达梦策略
- 考虑使用版本化数据库管理(如 Liquibase / Flyway)
✅ 八、后续建议
- 编写《数据库兼容性手册》
- 建立 SQL 审核制度
- 引入监控工具监控慢 SQL、执行计划(达梦提供相关日志)
- 定期使用
ANALYZE TABLE
优化索引统计信息
你说得对,达梦数据库 DM8 从较早版本起确实内置了 DUAL
表,但其行为在某些细节上与 Oracle 有所差异。我们来重新、更加严谨地整理整个 Oracle → 达梦(DM8)迁移对照表,包括你提到的 DUAL、函数、类型等,并加上 “支持情况 + 特性说明”,方便项目中直接参考。
✅ Oracle → 达梦(DM8)迁移兼容性对照手册(完整版)
📦 一、数据类型映射表
VARCHAR2(n)
VARCHAR(n)
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
(建议)RAW
/ LONG RAW
BINARY(n)
BFILE
BLOB
FLOAT(n)
FLOAT(n)
📄 二、常用函数与表达式对照表
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
DUAL
SELECT 1 FROM dual
INSTR
, SUBSTR
, LENGTH
REGEXP_LIKE
LIKE
、INSTR
替代CASE WHEN
MERGE INTO
CONNECT BY
层级查询START WITH ... CONNECT BY
,基本一致SYS_GUID()
🧱 三、表结构与数据库特性对比
SEQUENCE + trigger
/ IDENTITY
IDENTITY
,更推荐使用/
)return
类型是否兼容SELECT 1 FROM dual
完全兼容🧪 四、分页写法对比(建议统一改造)
sql SELECT * FROM user WHERE ROWNUM <= 10
FETCH FIRST 10 ROWS ONLY
SELECT * FROM user LIMIT 10 OFFSET 0
✅ 总结建议
- DM8 已大幅提升兼容性,绝大部分 SQL、函数、数据类型可以平滑迁移;
ROWNUM
、REGEXP_LIKE
、部分 PL/SQL 特性仍需重点测试;- DUAL 表在 DM8 中是支持的,可以放心使用;
- 建议迁移前,使用工具扫描全库 SQL,形成兼容性分析报告;
- 若你使用 MyBatis,可以使用自定义分页插件替代 Oracle 特有分页写法。