跳到主要内容SpringBoot+Nacos 整合达梦数据库:MySQL 迁移与持久化配置实战 | 极客日志Javajava
SpringBoot+Nacos 整合达梦数据库:MySQL 迁移与持久化配置实战
SpringBoot 项目从 MySQL 迁移到达梦数据库并整合 Nacos 持久化。涵盖环境准备、驱动替换、SQL 语法适配、数据迁移及 Nacos 配置中心改造。解决大小写敏感、连接池调优、动态刷新等常见问题,提供生产环境优化建议与高可用部署方案。
内存管理1K 浏览 一、环境准备(含版本适配 + 工具清单)
1.1 版本适配明细表(关键避坑)
| JDK 版本 | 推荐驱动 |
|---|
| JDK 8 | DmJdbcDriver18.jar |
| JDK 11+ |
✅ 推荐:测试环境先搭建单机版达梦 + Nacos,验证通过后再部署集群。
1.2 必备工具清单
- 达梦数据库工具:达梦管理工具(图形化界面)、DTS 数据迁移工具
- 开发工具:IntelliJ IDEA、Maven 3.6+
- 截图标注工具:Snipaste(Windows)/Snagit(Mac)
- 日志查看工具:Notepad++(Windows)/iTerm2(Mac)
1.3 环境预配置
- 达梦数据库:创建两个独立数据库(SPRINGBOOT_DB 用于业务数据,NACOS_DB 用于 Nacos 持久化),授权账号 SYSDBA(测试环境)/ 专用账号(生产环境);
- Nacos:解压安装包,提前创建 plugins/mysql 目录(用于放置达梦驱动);
- SpringBoot:备份原有 MySQL 配置,确保项目可正常编译运行。
二、SpringBoot 项目从 MySQL 迁移到达梦数据库
步骤 1:修改项目依赖(替换 MySQL 驱动)
1.1 移除 MySQL 依赖
1.2 引入达梦驱动(两种方式)
1.3 引入 Nacos 配置依赖(生产环境)
注意:达梦 JDBC 驱动版本必须与 JDK 版本匹配,JDK8 对应 DmJdbcDriver18.jar,JDK11 + 对应 DmJdbcDriver19.jar,否则驱动加载失败。
步骤 2:配置改造(本地测试→Nacos 多环境)
2.1 本地测试配置(application.yml)
2.2 Nacos 多环境配置(生产核心)
第一步:Nacos 控制台创建环境
分别创建 dev(开发)、test(测试)、prod(生产)命名空间,记录每个命名空间的「命名空间 ID」;
第二步:每个环境配置达梦数据源
进入 dev 命名空间→「配置管理」→「配置列表」→「新增配置」;
- Data ID:springboot-dm.yml(与项目名称对应);
- Group:DEFAULT_GROUP;
- 配置格式:YAML;
- 配置内容:
- 同理,在 test/prod 命名空间创建对应配置(修改数据库 IP、账号、密码)。
第三步:SpringBoot 项目关联 Nacos 多环境
创建 bootstrap.yml(优先级高于 application.yml):
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
group: DEFAULT_GROUP
namespace: <your-namespace-id>
步骤 3:SQL 语法适配(核心迁移环节)
达梦兼容大部分 MySQL 语法,但以下差异必须适配,否则会出现表创建失败、查询异常:
| MySQL | 达梦 (DM) | 说明 |
|---|
| IFNULL | NVL | 空值处理函数 |
| GROUP_CONCAT | WM_CONCAT | 字符串聚合 |
| AUTO_INCREMENT | IDENTITY | 自增列定义 |
示例:表结构适配实战
完整 Nacos 达梦适配 SQL 脚本(可直接复制)
-- 其余表(config_info_beta、config_tags_relation 等)按上述规则适配,完整脚本共 12 张
步骤 4:数据迁移(达梦 DTS 工具一键实现)
4.1 迁移流程
- 打开达梦管理工具→「工具」→「数据迁移」,新建迁移项目;
- 配置源库(MySQL):
- 数据库类型:MySQL;
- 主机名:MySQL 服务器 IP;
- 端口:3306;
- 数据库名:待迁移的 MySQL 数据库名;
- 用户名 / 密码:MySQL 账号密码;
- 数据库类型:达梦 8;
- 主机名:达梦服务器 IP;
- 端口:5236;
- 数据库名:SPRINGBOOT_DB(提前创建);
- 用户名 / 密码:达梦账号密码;
- 选择迁移对象:勾选需要迁移的表(可全选),点击「下一步」;
- 迁移选项配置:默认即可(工具自动适配部分语法),点击「开始迁移」;
- 迁移验证:迁移完成后,在达梦管理工具中查询表数据,确认数量与 MySQL 一致。
4.2 迁移后数据验证 SQL
步骤 5:SpringBoot 项目代码适配(少量调整)
5.1 MyBatis 映射文件适配
- 替换 GROUP_CONCAT 为 WM_CONCAT:
5.2 分页插件适配(若使用 PageHelper)
在 application.yml 中添加达梦方言配置:
三、Nacos 整合达梦数据库(自身持久化配置)
此步骤确保 Nacos 的配置、命名空间、租户等数据持久化到达梦,而非默认的嵌入式 Derby 数据库。
步骤 1:Nacos 配置文件修改
编辑 Nacos 安装目录下的 conf/application.properties,新增 / 覆盖以下配置:
步骤 2:部署达梦 JDBC 驱动到 Nacos
- 进入 Nacos 安装目录,创建 plugins/mysql 目录(Nacos 默认读取该目录下的 JDBC 驱动);
- 将达梦驱动 DmJdbcDriver18.jar 复制到 plugins/mysql 目录;
- Linux 环境下赋予权限:chmod 644 plugins/mysql/DmJdbcDriver18.jar(避免权限不足导致驱动无法加载)。
步骤 3:初始化 Nacos 达梦数据库
- 登录达梦管理工具,执行「步骤 3」中提供的「完整 Nacos 达梦适配 SQL 脚本」,创建 12 张 Nacos 所需表;
- 验证表结构:执行 SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='SYSDBA' AND TABLE_NAME LIKE 'CONFIG_%',确认表创建成功
步骤 4:启动 Nacos 并验证持久化
4.1 启动 Nacos(单机模式)
- Linux/Mac:sh startup.sh -m standalone;
- Windows:startup.cmd -m standalone。
4.2 日志验证(关键)
查看 Nacos 日志文件 logs/start.out,搜索以下关键词,确认无错误:
- 成功日志:Loaded JDBC driver: dm.jdbc.driver.DmDriver(驱动加载成功);
- 成功日志:Init DruidDataSource successful(数据源初始化成功);
4.3 功能验证
- 登录 Nacos 控制台,新增配置(Data ID:test-nacos-dm,Group:DEFAULT_GROUP,内容:test: 123);
- 停止 Nacos:sh shutdown.sh(Linux)或关闭 cmd 窗口;
- 重新启动 Nacos,查看控制台是否仍存在 test-nacos-dm 配置;
- 达梦数据库验证:执行 SELECT * FROM config_info WHERE data_id='test-nacos-dm';,确认查询到配置记录;
四、全流程联调验证(SpringBoot+Nacos + 达梦)
验证 1:配置链路验证(Nacos→SpringBoot→达梦)
- 修改 Nacos dev 环境的 springboot-dm.yml,调整达梦连接池参数 max-active: 30;
- 启动 SpringBoot 项目,查看日志:Nacos config changed, refresh config: springboot-dm.yml(配置刷新成功);
- 代码中添加配置监听(验证动态刷新):
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class ConfigController {
@Value("${spring.datasource.druid.max-active}")
private Integer maxActive;
@GetMapping("/config/maxActive")
public Integer getMaxActive() {
return maxActive;
}
}
验证 2:数据链路验证(SpringBoot→达梦业务库)
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/{id}")
public SysUser getUserById(@PathVariable Long id) {
return userMapper.selectById(id);
}
@PostMapping("/add")
public Boolean addUser(@RequestBody SysUser user) {
return userMapper.insert(user) > 0;
}
}
- 调用 /user/add 接口新增用户,验证数据写入达梦;
- 调用 /user/{id} 接口查询用户,验证数据读取正常;
- 达梦数据库查询:SELECT * FROM sys_user WHERE id={新增 ID},确认数据一致;
验证 3:异常场景验证(稳定性测试)
- 断开关闭达梦数据库,启动 SpringBoot 项目,日志应抛出 SQLException: 网络通信异常(正常);
- 重启达梦数据库,SpringBoot 自动重连(依赖 Druid 连接池配置),接口恢复正常;
- 停止 Nacos 服务,SpringBoot 项目仍能正常运行(使用本地缓存的配置)。
五、常见问题及解决方案
基础问题(必遇场景)
问题 1:SpringBoot 启动提示 'ClassNotFoundException: dm.jdbc.driver.DmDriver'
- 原因:达梦驱动未引入,或 systemPath 路径错误,或 Nacos 驱动放置目录错误;
- 解决方案:
- SpringBoot 项目:检查 pom.xml 中驱动依赖的 systemPath 是否指向真实文件,或使用私服依赖;
- Nacos:确认驱动放在 plugins/mysql 目录,而非 plugins 根目录。
问题 2:Nacos 启动提示 'Table 'config_info' not found'
- 原因:Nacos 达梦数据库脚本未执行,或脚本语法错误;
- 解决方案:
- 重新执行「步骤 3」中的完整 Nacos 达梦适配 SQL 脚本;
- 检查达梦数据库 NACOS_DB 的所有者是否为当前连接用户。
问题 3:数据迁移后中文乱码
- 原因:MySQL 导出编码与达梦导入编码不一致;
- 解决方案:
- DTS 迁移时,在「迁移选项」中设置「字符集」为 UTF8;
- 达梦数据库创建时指定 DEFAULT CHARSET UTF8。
延伸踩坑(进阶场景)
坑 1:达梦大小写敏感导致表名 / 字段名找不到
- 现象:SpringBoot 报错 Table or view does not exist,但达梦中存在该表;
- 原因:达梦默认区分表名 / 字段名大小写(MySQL 默认不区分);
- 解决方案:
- 连接 URL 中添加 lowerCaseTableName=true(强制小写);
- 创建表时统一使用小写表名 / 字段名。
坑 2:SpringBoot 动态刷新 Nacos 配置后,达梦连接未生效
- 现象:修改 Nacos 中的达梦密码,调用/actuator/refresh 后,连接仍使用旧密码;
- 原因:数据源配置未添加@RefreshScope,或连接池未重启;
- 解决方案:
- 在数据源配置类上添加@RefreshScope;
- 生产环境建议通过重启服务生效敏感配置(如密码)。
坑 3:MyBatis-Plus 代码生成器适配达梦失败
- 现象:代码生成器报错'不支持的数据库类型';
- 解决方案:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator-dm</artifactId>
<version>3.5.3.1</version>
</dependency>
DataSourceConfig dsc = new DataSourceConfig.Builder(
"jdbc:dm://192.168.1.100:5236/SPRINGBOOT_DB",
"SYSDBA",
"SYSDBA"
).dbQuery(new DmQuery()).build();
六、核心原理 + 延伸技术点(提升深度)
6.1 核心原理说明
1. Nacos 整合达梦的底层逻辑
- Nacos 默认使用嵌入式数据库 Derby 存储配置数据,但 Derby 不支持集群和数据持久化(重启丢失);
- 通过配置 spring.datasource.platform=dm,Nacos 会加载 plugins/mysql 目录下的达梦 JDBC 驱动;
- 底层使用 Druid 连接池管理达梦连接,将配置、命名空间、租户等数据持久化到指定的达梦数据库;
- 核心流程:启动 Nacos→加载数据源配置→初始化 Druid 连接池→替换默认 Derby 数据源→数据读写达梦。
2. 达梦与 MySQL 的核心差异本质
- 内核设计:达梦是自主研发的国产化数据库,兼容 SQL92 标准,MySQL 是开源数据库,拓展了部分 SQL 语法;
- 数据类型:达梦的 DATETIME 类型精度更高(支持到毫秒),IDENTITY 自增列支持更灵活的配置;
- 函数支持:达梦提供 NVL、WM_CONCAT 等特有函数,本质是为了适配国产化场景下的业务需求。
6.2 延伸技术点(进阶拓展)
1. 达梦数据库性能监控
- 达梦自带监控:通过「达梦管理工具→性能监控」查看连接数、CPU 使用率、慢查询;
- 第三方监控:集成 Prometheus+Grafana,使用达梦官方提供的 Exporter 采集指标,配置监控面板。
2. 达梦集群适配(生产高可用)
- 达梦集群模式:主备模式(一主一备)、共享存储模式;
- Nacos 适配达梦集群:修改 db.url.0 为集群连接 URL:
db.url.0=jdbc:dm://192.168.1.100:5236,192.168.1.101:5236/NACOS_DB?useUnicode=true&failOver=true
3. 达梦数据库备份与恢复
- 自动备份:达梦管理工具→「备份还原」→「新建备份任务」,设置每日全量备份;
- 手动备份:执行 SQL 命令:
BACKUP DATABASE BACKUPSET '/dm/backup/nacos_db_backup_20240520';
RESTORE DATABASE FROM '/dm/backup/nacos_db_backup_20240520' WITH REPLACE;
七、生产环境优化建议(增强实用性)
1. 权限管控(安全第一)
- 达梦数据库:为 SpringBoot 和 Nacos 分别创建专用账号,仅授予对应库的 SELECT、INSERT、UPDATE、DELETE 权限,禁用 DROP、ALTER 等高危权限;
- Nacos:开启身份认证(nacos.core.auth.enabled=true),修改默认账号密码(nacos.core.auth.password=加密后的密码)。
2. 连接池调优(性能优化)
spring:
datasource:
druid:
max-active: 100
min-idle: 20
max-wait: 5000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
db.pool.config.maxActive=100
db.pool.config.minIdle=20
db.pool.config.maxWait=5000
3. 数据备份策略(防丢失)
- 达梦业务库(SPRINGBOOT_DB):每日凌晨执行全量备份,每小时执行增量备份;
- Nacos 达梦库(NACOS_DB):与业务库同步备份,备份文件异地存储;
- 定期验证备份文件可用性(每月恢复测试一次)。
4. 监控告警(提前预警)
- 监控指标:达梦数据库连接数、慢查询数、表空间使用率;Nacos 配置加载成功率、数据源连接状态;
- 告警方式:通过企业微信 / 钉钉机器人推送告警信息(如连接数超过阈值、慢查询时长超过 1 秒)。
5. 集群部署(高可用)
- Nacos 集群:3 个节点,均指向同一个达梦数据库,确保配置一致性;
- SpringBoot 集群:通过 Nacos 统一管理达梦配置,避免节点配置不一致;
- 达梦集群:主备模式,自动故障转移,确保数据库高可用。
附:工具下载链接
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online