Nacos对接达梦数据库:从MySQL方言改造到JDBC驱动替换
2026/9/7 4:07:45 网站建设 项目流程

简介:面向需要将 Nacos 与达梦数据库打通的开发与运维人员,该资源包围绕国产化数据库适配场景,覆盖 JDBC 驱动加载、连接参数配置、服务注册与发现、配置动态刷新、健康检查等关键环节,适用于在分布式系统中落地达梦数据库管理。资源共 17 个文件,压缩包约 150.26MB,以 SQL 初始化脚本、conf 配置文件、启停 sh/cmd 脚本、properties 与 xml 配置、示例文件及 Nacos 服务端 jar 为主,并附带 license 与 notice 合规信息,目录结构清晰便于部署。基于 Nacos server 2.3.2 版本整理,包含 schema 初始化脚本、集群配置示例和启动关闭脚本,可帮助快速搭建基础环境;针对驱动兼容、SQL 语法差异、连接池调整等适配中常见问题,也提供了可参考的配置样例与排查思路。已有 2636 人学习下载,适合正在做达梦数据库适配或希望了解国产数据库与 Nacos 集成的中高级开发者。 上半年接了一个国产化改造项目,需求描述得很简单:把 Nacos 的数据落库从 MySQL 换成达梦数据库。我原本以为改改连接串就能收工,结果从建表脚本到驱动替换,前后折腾了接近两天才把链路完全跑通。如果你也是在做 Nacos 对接达梦数据库的适配,这篇文章应该能帮你少踩一半的坑。

这篇文章以我在 Nacos 2.2.x 版本下适配达梦 DM8 的实际过程为主线,覆盖达梦侧初始化、nacos-mysql.sql 的方言改造、JDBC 驱动替换、application.properties 配置、启动验证,以及几个容易让人误判的坑。适合正在做数据库国产化替换的 Java 后端、运维和架构师参考。

1. Nacos为什么需要做数据库适配

1.1 默认存储链路与切换逻辑

Nacos 开箱即用时,单机模式用的是内嵌 Derby 数据库,数据落在本机文件目录。Derby 对开发环境来说完全够用,但一旦上集群,或者你有数据备份、迁移、审计的需求,就必须切换到外部数据库。

官方文档里最常见的切换姿势是配置spring.datasource.platform=mysql。设置之后,Nacos 会读取db.numdb.url.0db.userdb.password这些配置,初始化外部数据源。

这里有一个很容易被忽略的关键点:Nacos 的数据源识别逻辑是按照 MySQL 的习惯设计的。无论是老版本里的ExternalDataSourceServiceImpl,还是后续版本里基于 Dialect 识别的实现,大部分开源分支都只内置了 Derby 和 MySQL 两种方言。也就是说,你告诉 Nacos“我要用外部数据源”,它默认你要用 MySQL,从驱动的加载方式、URL 前缀的判断,到运行时 SQL 的写法习惯,全按 MySQL 来处理。

所以适配达梦,本质上做的是三件事:

  • 配置项上仍然保留spring.datasource.platform=mysql,让 Nacos 走外部数据源分支;
  • 把底层的 MySQL 驱动换成达梦的 JDBC 驱动,同时处理连接串和连接池参数;
  • 把官方给的 MySQL 建表脚本改写成达梦能直接执行的 SQL。

如果只做其中一步,启动时大概率会遇到“不认识的连接串”“驱动类找不到”“表结构不存在”之类的问题。

1.2 达梦数据库的兼容边界

达梦 DM8 为了让 MySQL、Oracle 用户能平滑迁移,提供了实例级参数COMPATIBLE_MODE,可以切换 Oracle、MySQL 等兼容模式。把模式切到 MySQL 后,反引号、时间戳默认值、常见的 MySQL 函数在达梦里会有更好的支持。

但这里要泼一盆冷水:兼容模式只是让 SQL 解析层更宽容,JDBC 驱动仍然是达梦自己的驱动,连接串也仍然是jdbc:dm://。Nacos 里那种“看 URL 前缀决定用哪套方言”的逻辑,依然认不出达梦。

因此,下面几章按实际实施顺序展开。先做达梦侧准备,再改 SQL 脚本,然后处理 Nacos 端的驱动和配置,最后启动验证。这几个步骤一个都不能跳。

2. 达梦侧初始化:用户、模式与兼容模式

2.1 先建账号,再谈建表

达梦里“用户”和“模式(schema)”是绑定的,执行CREATE USER之后会自动生成一个同名 schema。Nacos 连数据库时用哪个账号,它默认访问的 schema 就是哪个,所以建议单独建一个专用账号,不要图省事用 SYSDBA 来跑业务。

在达梦管理工具或者命令行里执行:

CREATE USER NACOS IDENTIFIED BY "Nacos@123"; GRANT DBA TO NACOS;

测试环境给 DBA 权限最省事,因为 Nacos 运行期间要频繁读写配置表、权限表和注册实例表,授权太细很容易在某个环节突然冒出权限不足的报错。生产环境建议按最小权限来,至少保证该用户有建表、增删改查、索引和视图相关权限。

另外,达梦默认可能会启用密码复杂度策略,弱密码会被拒绝。你直接设一个包含大写字母、小写字母和数字的密码,后面连接和配置都用这个账号。

2.2 把实例切到 MySQL 兼容模式

新装好的 DM8,COMPATIBLE_MODE默认通常是 0(Oracle 风格),改成 1(MySQL 兼容模式)之后,很多 MySQL 写法的 SQL 能少改一些。修改方式是在 DM 管理工具里找到实例参数COMPATIBLE_MODE,保存后按提示重启数据库实例。

这里我的建议是“两条腿走路”:一方面开兼容模式,让大部分脚本能跑过去;另一方面,建表脚本里明显不合法的内容仍然手动改。比如INSERT IGNOREON UPDATE CURRENT_TIMESTAMP这类写法,就算开了兼容模式,也可能要看具体版本的支持情况,不要赌。

还需要强调一点:COMPATIBLE_MODE是实例级参数,如果这台达梦实例上还跑着其他业务库,切换前一定要确认影响范围,最好在独立实例或者测试实例上做验证。

3. 建表脚本从MySQL方言到达梦方言

3.1 先搞清楚Nacos需要哪些表

Nacos 安装包的 conf 目录下有一个nacos-mysql.sql,这是官方提供的 MySQL 建表脚本。第一次在达梦里执行,基本第一句就会报错,原因就是 MySQL 特有的引擎、字符集、反引号、自增列写法,达梦不认。

脚本里的表大致分三类:

  • 配置中心相关:config_infoconfig_info_betaconfig_info_grayconfig_info_tagconfig_tags_relationhis_config_infotenant_info等;
  • 权限相关:usersrolespermissions
  • 注册中心相关:2.x 版本里以naming_开头的一组表,不同小版本表名会有些差异,以你下载的 SQL 脚本实际内容为准。

注意,如果你的 Nacos 是从 2.0 升级上来的,脚本里可能还包含老的表结构迁移逻辑,这些语句在达梦里也可能报错。能手动确认的,最好手动确认一遍。

3.2 高频不兼容语法对照与改写

我自己在改造时,整理了一张 MySQL 到达梦的对照表,遇到不兼容的写法直接查表替换:

MySQL 写法达梦推荐写法说明
`column_name`反引号"column_name"或直接不加引号兼容模式下反引号也许能过,但不建议赌
BIGINT(20) NOT NULL AUTO_INCREMENTBIGINT IDENTITY(1,1) NOT NULL自增语法不同,达梦用 IDENTITY
LONGTEXT NOT NULL COMMENT '配置内容'CLOB NOT NULL达梦用 CLOB 存储大字段
DATETIME DEFAULT CURRENT_TIMESTAMPTIMESTAMP DEFAULT CURRENT_TIMESTAMPTIMESTAMP 写法更稳
ON UPDATE CURRENT_TIMESTAMP触发器或应用层维护达梦没有这个列属性
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4直接去掉达梦不认这种表尾注
KEY idx_name (col)建索引单独CREATE INDEX拆出来写更清晰
INSERT IGNORE INTO users ...改写为普通 INSERT 或 MERGE兼容模式不一定支持 IGNORE 语义

config_info为例,原始脚本里一堆反引号、COMMENTENGINE尾注。改到达梦风格后,核心表结构长这样:

CREATE TABLE config_info ( id BIGINT IDENTITY(1,1) NOT NULL, data_id VARCHAR(255) NOT NULL, group_id VARCHAR(255) DEFAULT NULL, content CLOB NOT NULL, md5 VARCHAR(32) DEFAULT NULL, src_ip VARCHAR(50) DEFAULT NULL, src_user VARCHAR(128) DEFAULT NULL, gmt_create TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, gmt_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ); CREATE INDEX idx_config_info_tenant ON config_info (data_id, group_id);

真实的config_info表还有tenant_idapp_nametypec_schema等字段,我上面只是把最核心的列拿来做演示。实际改造时,以官方脚本字段为准,逐个改,不要漏列。

还有一个容易翻车的地方是users表。官方脚本里有初始账号插入语句,enabled字段原来是tinyint(1),达梦建议改成INT,插入语句里的TRUE也要改成1

CREATE TABLE users ( username VARCHAR(50) NOT NULL, password VARCHAR(500) NOT NULL, enabled INT NOT NULL, PRIMARY KEY (username) ); INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);

这条 BCrypt 哈希对应的默认密码是nacos,后面启用了鉴权,用它登录控制台就能进。

3.3 批量迁移还是手工改写

如果项目里表特别多,手工逐张改确实累。也有朋友问我能不能用 DBeaver 或者达梦的迁移工具直接导。实际操作下来,迁移工具可以把 MySQL 的表结构和数据搬过去,但搬过去的字段类型不一定符合 Nacos 运行时要求,比如longtext可能被识别成CLOB或者TEXT,自增主键的初始值也可能对不上。

我的建议是:结构迁移用工具辅助,改完必须人工核对关键列类型和索引。最稳妥的方式还是拿官方nacos-mysql.sql做一次手工方言改造,全程可控,后续 Nacos 升级要重新建表时,这份改好的 DDL 还能继续复用。

4. Nacos端改造:驱动、配置与启动

4.1 驱动替换和冲突处理

Nacos 默认自带 MySQL 驱动,在安装目录的 lib 下面。要让它连接达梦,就需要把达梦驱动放进去。达梦驱动DmJdbcDriver18.jar通常在达梦安装目录的drivers/jdbc下,也可以从达梦官网下载。

拿到 jar 之后,复制到 Nacos 安装目录的 lib 里。如果 2.x 版本的目录结构不一样,可以用find . -name 'mysql-connector*'定位一下原来的驱动位置,放在同目录下即可。

这里有一个很多人纠结的点:原来带的 mysql-connector 要不要删?我的建议是:先不要删。因为某些版本的 Nacos 在数据源初始化时,会直接引用 MySQL 驱动相关的类,你把它删了反而会报ClassNotFoundException。先保留原驱动,放入达梦驱动,启动后看日志,如果明确提示驱动冲突,再移除也不迟。

4.2 application.properties 关键配置

Nacos 的配置文件在conf/application.properties,核心数据源配置示例如下:

spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:dm://127.0.0.1:5236/NACOS db.user=NACOS db.password=Nacos@123

每一项展开说一下:

  • spring.datasource.platform=mysql:不能改成dm,因为 Nacos 的方言选择逻辑里没有 DM 分支。保留mysql是为了让它走外部数据源分支,实际底层连接已经换成了达梦驱动。
  • db.url.0=jdbc:dm://127.0.0.1:5236/NACOS:达梦默认端口是 5236,NACOS是之前创建的用户名,也就是 schema 名。
  • db.userdb.password:就是达梦里创建的 NACOS 账号。

如果你的环境连接数压力比较大,可以按需增加连接池配置:

db.pool.config.connectionTimeout=30000 db.pool.config.maximumPoolSize=20 db.pool.config.minimumIdle=5

连接池参数不同的小版本支持程度不一,以你使用的版本文档为准。这里尤其要注意:连接串里不要带 MySQL 特有的useSSL=falseserverTimezone=UTC这种参数,达梦驱动根本不认识,加了反而启动失败。

4.3 单机启动与集群启动

单机验证时,直接执行启动脚本:

sh startup.sh -m standalone

然后观察日志:

tail -f logs/start.out tail -f logs/nacos.log

重点看有没有“数据源初始化异常”“表不存在”“方言不支持”之类的关键报错。如果日志能顺利出现 Nacos started,说明数据源这关已经过了。

集群模式要额外确认两点:第一,所有节点的cluster.conf配置好集群节点列表;第二,所有节点数据库指向同一个达梦库。Nacos 集群的配置中心数据一致性依赖外部数据库,注册中心部分则依赖 Distro 协议做节点间同步。如果哪个节点还顺着默认配置走了内嵌 Derby,等出现配置不一致的时候再排查就晚了。

5. 启动后怎么验证适配真的成功了

5.1 配置中心验证

控制台能打开只是第一步。我习惯先把配置链路完整测一遍:

  1. 登录 Nacos 控制台,创建一个新的 namespace;
  2. 在命名空间下发布一条配置;
  3. 修改这条配置,再发布一次;
  4. 去达梦客户端执行 SQL:
SELECT data_id, group_id, md5, gmt_create, gmt_modified FROM config_info; SELECT data_id, group_id, content FROM his_config_info ORDER BY gmt_modified DESC;

如果config_info里能看到当前配置,his_config_info里能看到历史版本,说明配置写入和历史版本存储都正常。还要注意一点,发布配置后修改一个值,观察客户端能否动态刷新拿到最新值。这一步很多人会漏,但字段类型和时间精度差异,可能导致 Nacos 比较 MD5 或更新时间时出现问题,所以必须在达梦存储下重新验证一遍。

5.2 服务注册与心跳验证

配置中心过了,服务注册也要测。启动一个 Spring Cloud 应用,配置服务发现地址指向 Nacos,注册成功之后去达梦实例表里查记录。Nacos 2.x 注册中心相关表名带naming_前缀,不同版本表名不完全一致,可以用这条 SQL 列出:

SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'NAMING%';

确认实例表里有注册记录后,再把应用停掉,观察临时实例是否在到期后自动被清理。这一步验证的是心跳和健康检查流程在达梦存储下是否正常工作,不能只是注册上去就不管了。

5.3 顺带做一次控制台安全加固

适配过程中我顺手把 Nacos 控制台的鉴权也开了,因为改造完暴露在公网的 Nacos 如果没有访问控制,容易被人扫到“namespaces 未授权访问”这类风险。Nacos 2.2.1 以后版本推荐在application.properties里配置:

nacos.core.auth.enabled=true nacos.core.auth.plugin.nacos.token.secret.key=替换为至少32字节的Base64编码字符串 nacos.core.auth.server.identity.key=server_identity nacos.core.auth.server.identity.value=替换为自定义值

核心思路是:开启鉴权、更换默认 token 密钥、自定义身份标识。开启之后,未登录访问控制台和接口会被拦截,之前担心的未授权访问漏洞就可以从配置层面堵住。新增的账号、角色都落在达梦的usersrolespermissions表里,正好一起管理起来。

6. 适配过程中最值得记录的坑

6.1 Derby残留数据导致的伪故障

之前在一台机器上跑过单机版 Nacos,用的默认 Derby 存储,后来切到达梦数据库,启动后控制台能打开,但有些配置要么查不到,要么显示的是旧值。一开始我以为是数据库连接有问题,翻日志也没有明显报错。

最后定位到是数据存储没切换干净:内嵌 Derby 的数据文件还留在 Nacos 的 data 目录里,外部数据库的数据和本地残留数据混在一起,展示结果自然就乱了。解决方法是,在切换数据库之前把旧的 data 目录备份后清理掉,再重新启动。类似问题也会出现在从 MySQL 换到达梦的场景里,一定要清理干净再启动。

6.2 大小写与 CLOB 字段的隐性差异

达梦在 MySQL 兼容模式下,表名和列名的大小写敏感机制跟原生 MySQL 还是不完全一样。Nacos 源码里很多 SQL 用的是固定大小写写法,建表时如果大小写不统一,运行时可能出现“表或视图不存在”的报错。我的习惯是:建表 DDL 里统一使用大写,或者统一使用不加引号的小写,让达梦按默认规则去解析,避免引入无谓的大小写匹配问题。

另一个容易踩的点是 CLOB 字段。达梦的 CLOB 不能像 MySQL 的 longtext 那样随意参与唯一索引、排序或者部分比较操作。配置内容、历史配置内容这些字段,建表时可以设成 CLOB,但不要给 CLOB 加索引,也不要在应用层 SQL 里对 CLOB 做强约束,否则执行阶段会报错。

6.3 碰到“不支持”时怎么定位

如果启动后直接出现数据库类型不支持、或者不识别jdbc:dm前缀的情况,这属于正常现象,不代表适配思路错了。正确做法是下载和你安装版本一致的 Nacos 源码,在源码里搜这些关键字:

  • jdbc:mysql
  • MysqlDataSource
  • DataBaseDialect
  • DEFAULT_DB_TYPE

搜完之后基本就能看清当前版本是怎么做数据源识别的。如果是硬编码判断 URL 前缀,就在对应分支里补一个达梦分支;如果有 SPI 扩展点,就按扩展点实现一个达梦方言,重新编译打包并替换掉对应模块的 jar。

这个过程听起来门槛高,但改完一次之后,后续升级 Nacos 版本时可以把同样的补丁逻辑带过去,比每个环境都重新踩一遍要省事得多。

整个适配做完之后,我最大的体会是:数据库国产化适配的真正难点,不在于 SQL 语法改了多复杂,而在于框架有没有给外部数据库留出扩展口子。Nacos 对达梦这类国产数据库的内置支持现在还比较弱,所以需要我们自己补齐数据源识别、方言转换和驱动替换这几块。如果你也正好卡在这个改造节点上,记住一条:先跑通单机,再做集群,把每张核心表的读写都验证一遍,不要只看控制台能登录,就对外宣布适配完成了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询