Nacos接达梦数据库全攻略:数据源切换与初始化脚本改造

发布时间:2026/10/16 5:26:28
Nacos接达梦数据库全攻略:数据源切换与初始化脚本改造 简介面向需要将 Nacos 配置中心与达梦数据库DM打通的开发与运维人员这套 Nacos 达梦适配方案提供了可直接部署的 Windows/Linux 版本同时附带完整源码支持导入 IDEA 自行编译和二次修改。已编译产物位于 nacos-2.1.2/distribution/target拷贝后配合内置 SQL 脚本导入达梦数据库即可运行免去手工适配的繁琐步骤。资源共 92 个文件整体约 297.51MB除了核心 jar 包及 tar.gz/zip 安装包外还包含 properties、yaml、xml 等配置类文件用于调整连接参数与集群设置shell 脚本便于跨平台启停SQL 脚本完成建库建表日志与 raft_meta、manifest 等文件则记录运行期状态方便定位配置推送、元数据同步等环节的异常。已有 892 人学习参考无论是正在推进国产化数据库替换还是希望深入理解 Nacos 数据源扩展机制的读者都能借此快速落地并掌握改造思路。1. nacos接达梦大多数人第一步就走错了搞过 nacos 配达梦数据源的人十有八九都卡在同一个地方不是驱动找不到也不是 SQL 写错而是 nacos 默认按 MySQL 那套初始化逻辑去建表结果赶到达梦上一跑就报语法错误。更头疼的是nacos 自带的mysql-schema.sql里用了达梦不认的字段类型和注释写法直接执行根本过不去。这个组合在国产化改造的模拟项目X里很常见某实验室、某公司的内部系统都在往这套架构上迁。装不好的话nacos 控制台起不来服务注册发现全是黑匣子连配置拉取都直接超时整个微服务集群相当于裸奔。这篇笔记就是把我自己适配 nacos 到达梦数据源的完整过程拆开讲从版本选型、建库、改配置到初始化脚本改造和最终验证每一步都给出能直接抄的命令和参数。适合正在做信创适配、被达梦方言和 nacos 配置折腾到头秃的开发者无论是新装环境还是已有 nacos 迁移数据源照着走都能少踩几个坑。2. 版本选型和环境准备先把三个底子打对2.1 JDK 和 nacos 版本怎么配才不打架nacos 对 JDK 的依赖非常敏感不同版本要求完全不一样。老一点的 nacos 1.x 用 JDK 8 跑得很稳但换成 JDK 11 之后启动脚本里有些内存参数会直接报错而 nacos 2.x 从 2.2 开始官方默认推荐 JDK 8 以上但真正跑生产我还是建议 JDK 8除非你有强需求必须上 11。原因很简单nacos 内部用了不少反射和字节码操作JDK 11 模块化之后对反射的访问控制更严经常出现莫名其妙地InaccessibleObjectException排查起来很费劲。我这次适配用的组合是 JDK 864 位 nacos 2.2.3 版本整套环境跑在 Linux 服务器上。选 2.2.3 而不是最新的 2.x是因为这个版本在达梦适配上有不少现成的踩坑记录可以参考社区里有人已经趟过路而 nacos 1.x 虽然也能改数据源但它的配置管理逻辑和 2.x 差异较大迁移到达梦时要改的东西更多。如果你是从 1.x 迁过来的建议直接换 2.2.3别在旧版本上做适配了。java -version # 输出第一行一定是 java version 1.8.0_xxx不能是 openjdk 11 或 17 # 如果是 openjdk 版本检查 /etc/profile 和 ~/.bashrc 里的 JAVA_HOME 指向安装 JDK 8 之后务必要确认JAVA_HOME环境变量真的生效了很多 nacos 启动失败都是因为JAVA_HOME指向了旧路径或者根本没设置。我一般在/etc/profile里写死export JAVA_HOME/usr/local/jdk1.8.0_202 export PATH$JAVA_HOME/bin:$PATHsourc之后用echo $JAVA_HOME验证一下输出必须是 JDK 8 的真实路径而不是系统自带的 OpenJDK 路径。这里有个坑有些 Linux 发行版自带 openjdk 11java -version看着是 11但你JAVA_HOME配的是 8nacos 启动脚本里用的是$JAVA_HOME/bin/java而不是java命令所以实际生效的版本以JAVA_HOME为准。我一般会直接which java看看它指向哪里如果指向/usr/bin/java就要小心是系统级链接。2.2 达梦数据库版本和驱动一个老坑达梦数据库的主流版本是达梦 8市面上能下载到的有开发版和标准版适配 nacos 时用达梦 8 完全没问题。达梦 8 的 JDBC 驱动分为两类一个叫DmJdbcDriver8.jar另一个是dm-jdbc-driver的 Maven 坐标。这两者在连接 URL 上略有差异但核心都在于驱动类名必须是dm.jdbc.driver.DmDriver这一点跟 MySQL 完全不一样。如果你是从 Maven 仓库拉驱动直接在 pom 里加dependency groupIdcom.dameng/groupId artifactIdDmJdbcDriver/artifactId version8.1.1.193/version /dependency但我实际测试下来Maven 中央仓库里的这个坐标不一定每次都拉得到版本号也可能对不上。最稳妥的方式是直接从达梦安装目录的drivers/jdbc下拷贝DmJdbcDriver8.jar放到 nacos 的plugins或者lib目录里。具体放哪个目录取决于 nacos 的启动方式单机模式直接放lib目录即可集群模式则要考虑多个节点保持一致。这里有个容易忽略的点达梦 8 的驱动是跟数据库小版本匹配的如果数据库是 8.1 而驱动是 8.3 的连接时可能报协议不匹配。我遇到过开发版驱动连标准版数据库虽然能连上但执行复杂 SQL 时报系统内部错误后来换了配套驱动就好了。所以装之前先确认达梦数据库的版本号# 在达梦数据库所在机器上执行 ./dmserver --version # 或通过 disql 登录后查 select * from v$version;驱动版本不对的坑比较隐蔽因为连接阶段不报错真正执行建表语句时才暴雷到时候排查方向很容易跑偏。我的经验是驱动和数据库版本必须完全一致别图省事随便拿一个 jar。2.3 nacos 目录结构和启动模式拿到 nacos 2.2.3 的压缩包之后解压到/opt/nacos下目录结构大概是这样/opt/nacos ├── bin │ ├── startup.sh │ └── shutdown.sh ├── conf │ ├── application.properties │ ├── mysql-schema.sql │ └── nacos-logback.xml ├── lib └── targetlib目录下默认有一堆 nacos 自带的 jar 包达梦驱动放这里就对了。conf目录里有mysql-schema.sql这个文件MySQL 和达梦的初始化脚本都靠它改造成达梦版本。启动单机模式用startup.sh -m standalone但注意 nacos 2.x 默认可能启动了集群模式如果application.properties里没配nacos.core.auth.enabled之类的参数单机模式就够了。我一般还会设置 JVM 参数因为 nacos 默认分配的堆内存偏保守配置多的时候容易频繁 GCsh /opt/nacos/bin/startup.sh -m standalone # 查看启动日志 tail -f /opt/nacos/logs/start.out看到Nacos started successfully才算起来但注意这是启动成功不代表数据源已经切到达梦了。数据源的切换验证要到后面几步才能确认。3. 达梦侧准备建库、建用户、跑初始化脚本3.1 在达梦里建一个专用的 nacos 库和用户nacos 默认会往数据源里写一堆表这些表是它自己管理配置和服务注册数据的核心所以最好不要跟业务表混在同一个 schema 下否则后续理数据很痛苦。达梦的逻辑结构和 MySQL 有点差异MySQL 里叫 database达梦里叫 schema但达梦的 schema 跟用户是绑定的。换句话说你建了一个用户它就自带一个同名 schemanacos 连接这个用户之后建的表全在这个 schema 下。我一般这样建用户-- 用 SYSDBA 登录达梦数据库执行 CREATE USER NACOS IDENTIFIED BY nacos2024; GRANT DBA TO NACOS;这里直接给了 DBA 权限虽然有些洁癖的朋友会说最小权限原则但 nacos 的初始化脚本要建表、建索引、插入元数据给 DBA 是省心做法。如果你所在环境有安全要求至少也要给CREATE SESSION、CREATE TABLE、CREATE INDEX、INSERT、DELETE、UPDATE这些权限不然初始化脚本跑到一半就报权限不足。连接 URL 也要注意达梦的 URL 写法跟 MySQL 差别很大jdbc:dm://localhost:5236达梦默认端口是 5236这个端口经常被人忽略拿 MySQL 的 3306 去连自然失败。如果你用的是达梦 8 开发版端口可以在安装时自定义但绝大多数环境都是 5236。3.2 mysql-schema.sql 为什么跑不过讲清楚达梦方言差异nacos 自带的mysql-schema.sql是给 MySQL 写的直接拿到达梦执行第一句就报错。原因有几个第一个是注释和字段类型。MySQL 里建表喜欢写COMMENT xxx达梦虽然支持COMMENT ON语句但建表语句里的行内注释写法并不完全兼容。第二个是自增列。nacos 的表里有不少主键字段MySQL 用BIGINT AUTO_INCREMENT达梦要用IDENTITY(1,1)或者序列来模拟直接跑肯定挂。第三个是索引和约束的写法达梦对UNIQUE KEY、PRIMARY KEY的命名和语法有自己的要求照着 MySQL 的写法大概率报错。所以正确做法是把mysql-schema.sql里的语句手工改成达梦方言。模板网上有不少人分享过但版本差异很大最靠谱的方式是我当时的做法——先让 SQL 按 MySQL 原样跑一遍记下第一批报错再逐条改。不过这样效率太低。我的经验是先把所有COMMENT和AUTO_INCREMENT批量替换掉再解决索引语法最后才跑。以下是 nacos 2.2.3 核心表在达梦下的建表脚本示例拿不出全部表重点看两个有代表性的-- 配置信息表 config_info达梦方言版 CREATE TABLE config_info ( id BIGINT NOT NULL IDENTITY(1,1), data_id VARCHAR(255) NOT NULL, group_id VARCHAR(255), content TEXT, md5 VARCHAR(32), src_ip VARCHAR(50), src_user VARCHAR(128), gmt_create TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, gmt_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, app_name VARCHAR(128), tenant_id VARCHAR(128) DEFAULT , c_desc VARCHAR(256), c_use VARCHAR(64), effect VARCHAR(64), type VARCHAR(64), c_schema TEXT, encrypted_data_key TEXT, PRIMARY KEY (id), UNIQUE (data_id, group_id, tenant_id) ); -- 服务注册表 instance_info简化版 CREATE TABLE instance_info ( id BIGINT NOT NULL IDENTITY(1,1), service_name VARCHAR(255) NOT NULL, cluster_name VARCHAR(255), ip VARCHAR(64) NOT NULL, port INT NOT NULL, metadata TEXT, enabled INT DEFAULT 1, gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ); COMMENT ON TABLE config_info IS 配置信息表; COMMENT ON COLUMN config_info.data_id IS 配置ID;注意我最后用了COMMENT ON语句这是达梦支持的注释写法跟 MySQL 的COMMENT xxx完全不同。如果你跑脚本时报无效的列名或者语法错误八成就是建表语句里混了 MySQL 的注释语法。3.3 手把手跑通初始化脚本初始化脚本改造完之后执行方式有两种一种是用达梦自带的disql命令行工具执行另一种是写一个 Java 程序用 JDBC 批量执行。disql是一次性的但要注意脚本里如果有CREATE TABLE重复执行会报错所以先清掉之前可能残留的表-- 如果之前跑过失败脚本先清掉所有残留表用 SYSDBA 登录 DROP TABLE IF EXISTS config_info; DROP TABLE IF EXISTS instance_info;达梦的DROP TABLE IF EXISTS语法是支持的但有些老版本不支持IF EXISTS这时候就要查询系统表确认表存在再删SELECT COUNT(*) FROM user_tables WHERE table_name CONFIG_INFO;执行初始化脚本我一般这样调 disqldisql nacos/nacoslocalhost:5236 # 然后执行 START /opt/nacos/conf/dm-schema.sql;如果脚本文件里没有连接信息直接disql进去就能执行。如果START命令执行时报错要看具体是哪一行达梦对 SQL 文件编码敏感文件必须是 UTF-8 无 BOM 格式Windows 上编辑完传到 Linux 经常带着 BOM会报第一行乱码。用file命令检查一下file dm-schema.sql # 输出必须是 UTF-8 Unicode text 而不是 with BOM如果发现是 BOM用sed -i s/^\xef\xbb\xbf// dm-schema.sql去掉再执行。4. 数据源切换配置四个核心参数决定能否起来4.1 application.properties 里的改动清单nacos 的conf/application.properties是唯一要改的配置文件。默认情况下它全部被注释走的是内嵌数据库一旦要切换到达梦必须把下面几行解开并改成达梦的值spring.datasource.platformdm db.num1 db.url.0jdbc:dm://localhost:5236 db.usernacos db.passwordnacos2024这里有几个坑逐个说。第一个是spring.datasource.platform默认值是mysqlnacos 会拿这个值去找对应的初始化脚本和方言。我见过有人改成dm然后 nacos 启动时一直尝试加载dm-schema.sql但 nacos 2.2.3 的 jar 包里根本没有这个文件最后报schema 不存在。正确的理解是spring.datasource.platform的值决定 nacos 用哪套内置 SQL 做连接校验和建表预检但真正执行建表用的是你自己准备的脚本。第二个是db.num这是 nacos 多数据源的个数。默认是 1如果写 0 或者不写nacos 会认为没有配置数据源直接起不来。如果是集群模式可以配多个 URL用db.url.1、db.url.2这种递增编号。第三个是db.password里面如果包含特殊字符比如或#在 properties 文件里有可能会被当成注释或分隔符。最好的方式是用单引号包住或者做转义。达梦默认对密码大小写敏感所以创建用户时用了nacos2024这里配置时就一定要原样写进去。4.2 驱动类名和 URL 的隐藏细节达梦的 JDBC URL 有一个容易被忽略的点是jdbc:dm://还是jdbc:dm://localhost:5236后面的参数要不要带?。nacos 的db.url.0配置里默认情况下可能带着?characterEncodingutf8serverTimezoneUTC之类的参数这是 MySQL 专属的达梦不认要全部去掉。# 正确的达梦 URL 写法 db.url.0jdbc:dm://localhost:5236 # 错误的写法带 MySQL 参数达梦驱动会报 url 解析失败 # db.url.0jdbc:dm://localhost:5236?characterEncodingutf8serverTimezoneUTC驱动类名不需要在配置文件里显式指定因为 nacos 会通过spring.datasource.platformdm去推断吗并不是。nacos 实际是用 Spring 的 DataSource 初始化逻辑驱动类名靠db.url前缀去匹配。但前提是达梦驱动 jar 包能被 ClassLoader 找到。我把DmJdbcDriver8.jar放在lib目录下单机模式启动完全没问题但如果 nacos 是在容器里跑或者通过 systemd 服务脚本启动classpath 可能不带lib下所有 jar这时候就必须显式把 jar 加到启动参数里。我在某实验室实操时踩过一个更刁钻的坑lib下同时存在 MySQL 的驱动 jar 和达梦驱动 jarnacos 启动时会自动探测所有驱动类如果两者都存在于 classpath 中某些版本会优先选择 MySQL 驱动去连达梦 URL结果直接抛Unable to obtain JDBC Connection。解决方式简单粗暴把用不到的 MySQL 驱动 jar 挪出lib目录。4.3 JVM 参数和启动参数的额外调整配合数据源切换我还会调一下 nacos 的 JVM 参数。默认的startup.sh里分配的内存比较保守如果服务器内存充足我一般会把堆调大一点避免配置多的时候频繁 GC。修改方式是在bin目录下的startup.sh里找到JAVA_OPT那一段JAVA_OPT${JAVA_OPT} -Xms1g -Xmx1g -Xmn512m这不是必须的但配置多、服务多的时候我建议加上。还有一点-Dnacos.standalonetrue要不要加取决于你的启动模式。如果直接用-m standalone这个参数会自动加上。如果你用systemd托管 nacos就需要在 service 文件里显式传这个参数否则 nacos 会尝试以集群模式启动然后因为没配集群节点报错。5. 避坑记录从驱动冲突到初始化表失败5.1 报错nacos 启动后日志里出现nacos did not start但进程还在现象startup.sh执行完没报错ps也能看到 java 进程但控制台访问不了日志里出现nacos did not start because dumpservice之类的字样。原因这是 nacos 2.x 对数据源连接做启动预检如果数据源连不上它会启动失败并自动退出。出现这个报错说明达梦连接参数或驱动有问题但进程残留是因为 shutdown 钩子没来得及执行。解决先去logs/start.out里搜ERROR我遇到的一半情况是db.num0或者db.url.0没配对多半是 URL 的端口写错。把配置文件改对后重启sh /opt/nacos/bin/shutdown.sh sh /opt/nacos/bin/startup.sh -m standalone5.2 报错Table CONFIG_INFO not found或者ORA-00942现象nacos 已经启动但访问配置列表时报表不存在控制台 500。原因初始化脚本没有成功执行或者执行到了错误的 schema 下。达梦的 schema 和用户绑定如果你用SYSDBA执行了建表脚本表建在SYSDBA的 schema 下而 nacos 连接的是NACOS用户自然找不到表。解决用NACOS用户重新执行建表脚本不要用管理员去建。如果已经用管理员建了表可以用达梦的 schema 切换语法把它们授权给 NACOS 用户但最省事的还是删除重建。另外注意手动执行脚本前要看当前 schema 是不是对上了SELECT USER; -- 确认输出是 NACOS5.3 报错Unknown character encoding或Unsupported character set现象启动阶段连接成功但执行 SQL 时中文报错配置内容写入后读取乱码。原因达梦数据库的字符集和 JDBC 通信编码不一致。nacos 的application.properties里没配连接字符集而达梦库默认字符集可能是 GBK如果 JDBC 驱动以 UTF-8 发送中文达梦内部存储就乱了。解决创建数据库时指定 UTF-8或者在连接 URL 上加?compatibleModemysql和字符集参数。注意达梦的 URL 参数跟 MySQL 不一样通用做法是建库时用 UTF-8CREATE DATABASE NACOS WITH ENCODINGUTF-8;如果已经建好了库那就把db.url.0调整为带utf8参数的形式然后重新执行初始化脚本。我个人建议建库时直接指定 UTF-8后面会省很多乱码的排查时间。5.4 报错Column ID must be empty或NULL not allowed现象nacos 启动后能访问但新注册服务时插入数据报错或者配置发布失败。原因达梦的自增列语法IDENTITY(1,1)没有正确写好或者主键列被当成普通列处理了。MySQL 的AUTO_INCREMENT在达梦里可以用IDENTITY但要注意必须是显式的而且建表脚本里BIGINT NOT NULL IDENTITY(1,1)的顺序有讲究。解决检查建表脚本中所有主键字段的定义改成下面这种标准达梦写法id BIGINT IDENTITY(1,1) NOT NULL PRIMARY KEY如果把IDENTITY漏了插入时就会报主键为空的错误。nacos 的代码是往表里显式插入主键值的所以如果你的表既没有IDENTITY也没有DEFAULT值插入必挂。5.5 报错Invalid object name: tenant_info之类现象启动成功后控制台能打开但一进命名空间页面就 500。原因初始化脚本只跑了config_info、instance_info这些大表漏掉了tenant_info、users、roles等配套表。nacos 2.2.3 的mysql-schema.sql里总计有十几张表必须全跑漏一张后续访问对应功能就报错。解决把mysql-schema.sql完整看一遍确认建表语句改完达梦方言后全部执行不要觉得自己用不到某些功能就跳过。我一开始就是只跑了主表结果命名空间页面一直报错白白排查了一个小时。6. 装完怎么验证从控制台到服务注册的完整检查6.1 验证数据源真的切到了达梦启动完成后第一件事不是打开控制台而是去达梦数据库里查一下 nacos 有没有写入元数据表。用 disql 登录SELECT TABLE_NAME FROM USER_TABLES ORDER BY TABLE_NAME;如果能看到config_info、tenant_info、users这些表说明 nacos 连接数据源成功并且初始化脚本执行到位了。如果只有空库没有表大概率是spring.datasource.platform配置的问题nacos 走了内嵌存储。6.2 验证配置发布和拉取打开 nacos 控制台默认地址http://服务器IP:8848/nacos默认用户名nacos密码nacos新建一个配置dataId: test-datasource.yml group: DEFAULT_GROUP 内容: spring: datasource: url: jdbc:dm://localhost:5236保存成功后在服务器上跑一个简单的 curl 命令拉取配置curl -X GET http://localhost:8848/nacos/v1/cs/configs?dataIdtest-datasource.ymlgroupDEFAULT_GROUP返回的 body 应该跟刚才发布的内容一致如果返回config data not exist说明写操作没落到达梦里。再去达梦表里查SELECT DATA_ID, CONTENT FROM CONFIG_INFO;如果表里有数据但 curl 拉不到检查tenant参数默认的空串对应public命名空间这个比较容易看漏。6.3 验证服务注册发现注册一个临时测试服务到 nacos利用 Open API 是最快的curl -X POST http://localhost:8848/nacos/v1/ns/instance?serviceNametest-serviceip192.168.1.100port8080返回ok之后去达梦查instance_info表SELECT SERVICE_NAME, IP, PORT FROM INSTANCE_INFO;能看到这一条记录说明服务注册的写路径完全走了达梦。然后查服务列表curl -X GET http://localhost:8848/nacos/v1/ns/instance/list?serviceNametest-service返回的hosts里能查到刚才注册的 IP 和端口说明读路径也没问题。到这一步nacos 适配达梦数据源才算真正跑通。我的习惯是每次改完application.properties或换了达梦驱动版本后强制走一遍“清库建表 → 启动 → 发配置 → 注册服务 → 查列表”这个完整闭环五个动作一分钟就能跑完但凡中间哪一步卡住日志翻出来都是直指问题的。希望帮到你。本文还有配套的精品资源点击获取