首页 / 资讯中心 / 文章详情

Nacos适配达梦数据库:从MySQL迁移到国产库的完整路径

Nacos适配达梦数据库:从MySQL迁移到国产库的完整路径 ★ FEATURED ARTICLE
简介这份资源面向需要在分布式架构中将Nacos与达梦数据库打通的开发与运维人员聚焦服务发现、配置管理、健康检查等场景下的国产数据库适配问题。包内共17个文件以sql建表脚本、conf配置样例、sh与cmd启停脚本、xml与properties配置文件为主另含jar驱动包及license、notice等说明文件压缩包约150.26MB覆盖从驱动加载、连接池配置到服务注册与配置动态更新的关键环节。已有2656人学习下载说明国产化替代场景下此类适配需求较为集中。读者可借助其中的达梦建表脚本、配置模板与启动脚本快速搭建Nacos对接达梦的运行环境理解驱动类名、JDBC URL、连接池参数等配置要点并参考健康检查与监控报警思路排查SQL语法差异、事务管理及兼容性问题减少自行摸索成本。1. Nacos适配达梦数据库从MySQL迁移到国产库的完整路径很多团队在做信创改造时Nacos 的配置中心和注册中心跑得好好的唯独底层存储还挂在 MySQL 上而甲方要求全栈国产化。这时候第一个撞上的问题就是Nacos 默认只支持 MySQL 作为外置数据源怎么让它认达梦我前后在三个项目里做过这件事从 DM8 到 Nacos 2.x 的组合踩了不少坑今天把完整路径拆开讲。核心思路其实不复杂——Nacos 用的是 Spring 的 DataSource 抽象理论上换驱动、改方言、导数据就能跑通但实际操作中 SQL 语法差异、分页写法、建表脚本兼容性会让你反复翻车。这篇内容适合正在做信创适配的后端工程师、运维以及需要把注册中心 Nacos 和配置中心一起迁到国产数据库的技术负责人。2. 为什么Nacos换达梦不是改个JDBC URL就完事2.1 Nacos的存储层到底依赖了哪些MySQL特性Nacos 的外置存储模式standalone 或 cluster 都可以配本质上是通过 Spring JDBC 直接操作数据库没有引入 MyBatis 或 JPA 这类 ORM 框架。这意味着所有 SQL 都是硬编码在 Java 代码和 XML 里的换数据库就得面对这些 SQL 的兼容性。具体来说Nacos 对 MySQL 的依赖集中在几个地方建表脚本mysql-schema.sql用了AUTO_INCREMENT、ENGINEInnoDB、utf8mb4字符集这些 MySQL 专有语法分页查询用了LIMIT offset, size的写法时间字段用了TIMESTAMP的默认值CURRENT_TIMESTAMP部分查询里还有INSERT ... ON DUPLICATE KEY UPDATE这种 MySQL 特有的 upsert 语法。达梦 DM8 虽然兼容大部分标准 SQL也提供了 MySQL 兼容模式但默认安装下这些语法并不是全部开箱即用。所以适配的核心工作量在于建表脚本改写、分页语法替换、upsert 语句调整以及驱动和连接池配置。2.2 达梦的MySQL兼容模式能省多少事达梦 DM8 提供了一个COMPATIBLE_MODE参数建库时可以设为 MySQL 兼容模式。设置之后AUTO_INCREMENT、LIMIT这些语法基本能识别但要注意几点第一兼容模式是在实例初始化时指定的已经建好的库改这个参数需要重启且不一定完全生效所以最好在规划阶段就定好。第二即使开了兼容模式ON DUPLICATE KEY UPDATE仍然不保证支持需要用达梦的MERGE INTO改写。第三字符集方面达梦用UTF8而不是utf8mb4建表时要对应调整。我一般建议如果是从零搭建开 MySQL 兼容模式能省掉 60% 左右的脚本改写工作如果是已有达梦实例不方便重建那就老老实实按达梦原生语法改工作量大概多一倍但更稳妥。2.3 驱动选型和版本匹配的硬约束Nacos 用的是 HikariCP 连接池驱动层面需要引入达梦的 JDBC 驱动DmJdbcDriver18.jar对应 JDK 8。这个 jar 不在 Maven 中央仓库里需要手动安装到本地仓库或私服。版本匹配上有个血泪经验达梦驱动版本要和数据库服务端版本对齐DM8 对应驱动用 8.1.x 系列。如果驱动版本低于服务端太多连接时可能报协议不匹配驱动太高则可能出现某些元数据接口行为变化。我一般用DmJdbcDriver18-8.1.3.140.jar这个版本在 DM8 8.1.3 上验证过稳定。连接 URL 的格式是jdbc:dm://host:port/DATABASE_NAME默认端口 5236。注意达梦的大小写敏感性——默认建库时如果选了大小写敏感表名和字段名都要严格匹配Nacos 的 SQL 里表名是小写的所以建库时建议选大小写不敏感省掉一堆引号问题。3. 手把手完成Nacos对接达梦的配置改造3.1 达梦侧建库建用户与初始化脚本改写先在达梦上创建一个专用数据库和用户。用 disql 或达梦管理工具执行-- 创建表空间路径根据实际环境调整 CREATE TABLESPACE NACOS_DATA DATAFILE NACOS_DATA.DBF SIZE 512 AUTOEXTEND ON NEXT 128 MAXSIZE 10240; -- 创建用户并指定表空间 CREATE USER NACOS IDENTIFIED BY Nacos2024 DEFAULT TABLESPACE NACOS_DATA; -- 授权 GRANT RESOURCE, PUBLIC TO NACOS; GRANT CREATE TABLE, CREATE VIEW TO NACOS;然后处理建表脚本。Nacos 源码的distribution/conf/mysql-schema.sql不能直接用需要做以下替换MySQL 原始写法达梦改写写法说明AUTO_INCREMENTIDENTITY(1,1)达梦自增列语法ENGINEInnoDB删除达梦不需要存储引擎声明utf8mb4UTF8字符集名称不同LIMIT 0,10LIMIT 10 OFFSET 0达梦分页语法ON DUPLICATE KEY UPDATEMERGE INTO ... WHEN MATCHED THEN UPDATEupsert 改写TIMESTAMP DEFAULT CURRENT_TIMESTAMPTIMESTAMP DEFAULT SYSDATE默认时间函数不同改写后的建表脚本大概有 12 张表核心的几张是config_info、config_info_beta、his_config_info、tenant_info。建议逐表改写后在达梦上执行验证不要一次性全跑出错时定位困难。3.2 Nacos服务端的application.properties关键配置改完数据库侧接下来配 Nacos 服务端。在conf/application.properties里把默认的 MySQL 配置替换为达梦# 关闭内置derby启用外置数据源 spring.datasource.platformdm db.num1 db.url.0jdbc:dm://192.168.1.100:5236/NACOS db.user.0NACOS db.password.0Nacos2024 # 连接池参数达梦下建议调小最大连接数 db.pool.config.maximumPoolSize20 db.pool.config.minimumIdle5 db.pool.config.connectionTimeout30000 db.pool.config.validationTimeout10000 db.pool.config.testWhileIdletrue db.pool.config.testOnBorrowtrue这里有几个参数值得展开说。spring.datasource.platform设成dm是为了让 Nacos 加载对应的驱动类但 Nacos 原生并没有dm这个 platform 的驱动映射所以还需要在启动脚本里把达梦驱动 jar 放到 classpath 下或者直接改nacos-server.jar的依赖。常见做法是在startup.sh的JAVA_OPT里追加-Dloader.pathplugins/dm然后把驱动 jar 放到plugins/dm目录。连接池参数方面达梦的连接创建比 MySQL 稍慢connectionTimeout建议不低于 30 秒。maximumPoolSize不要设太大达梦对并发连接的处理能力和 MySQL 有差异20 到 30 之间比较稳。3.3 驱动jar的引入与启动脚本调整达梦驱动 jar 需要手动获取通常在达梦安装目录的drivers/jdbc下能找到。拿到DmJdbcDriver18.jar后放到 Nacos 的plugins/dm/目录没有就新建。然后修改bin/startup.sh在JAVA_OPT变量里加上JAVA_OPT${JAVA_OPT} -Dloader.path${BASE_DIR}/plugins/dm如果是 Windows 环境改startup.cmd逻辑一样。注意loader.path是 Spring Boot 的PropertiesLauncher才支持的Nacos 默认用的就是PropertiesLauncher所以这个方式可行。启动后看日志logs/start.out如果出现HikariPool-1 - Start completed并且没有 SQL 异常说明数据源通了。再用curl http://localhost:8848/nacos/v1/console/health/readiness检查健康状态。3.4 验证配置中心与注册中心是否真正跑通数据源通了不代表业务功能没问题。需要分两步验证配置中心验证登录 Nacos 控制台新建一个配置然后通过 API 读取# 发布配置 curl -X POST http://localhost:8848/nacos/v1/cs/configs \ -d dataIdtest.yamlgroupDEFAULT_GROUPcontentkey: value # 读取配置 curl http://localhost:8848/nacos/v1/cs/configs?dataIdtest.yamlgroupDEFAULT_GROUP如果发布和读取都正常再去达梦里查config_info表确认数据真正落库了。注册中心验证启动一个 Spring Cloud 服务实例注册上来看控制台服务列表是否出现然后停掉实例看是否自动摘除。这一步会触发INSERT、UPDATE、DELETE多种 SQL能暴露大部分兼容性问题。4. Nacos适配达梦过程中最容易翻车的几个点4.1 启动报“表或视图不存在”但明明建了表现象Nacos 启动日志报Table NACOS.CONFIG_INFO doesnt exist但你在达梦里SELECT能查到这张表。原因达梦默认大小写敏感建表时如果用了小写且没加引号达梦会自动转成大写存储。而 Nacos 的 SQL 里写的是小写表名查询时就找不到了。解决建库时选大小写不敏感模式或者在建表时统一用大写表名并确保 Nacos 的 SQL 也匹配。最省事的办法是初始化实例时就设CASE_SENSITIVE0。4.2 配置列表分页查询返回空结果现象控制台配置列表第一页正常翻到第二页就空了或者总数不对。原因Nacos 的分页 SQL 用了 MySQL 的LIMIT offset, size语法达梦不认这种写法导致第二页开始的查询直接报错被吞掉或返回空。解决找到 Nacos 源码里所有分页查询把LIMIT ?,?改成LIMIT ? OFFSET ?。涉及的文件主要是ExternalConfigInfoPersistServiceImpl和ExternalConfigInfoBetaPersistServiceImpl。如果不想改源码可以在达梦的 MySQL 兼容模式下测试是否自动识别但兼容模式对分页的支持并不完整建议还是改源码重新编译。4.3 配置发布时报唯一约束冲突现象同一个 dataId 重复发布配置时报主键冲突或唯一索引冲突而不是正常更新。原因Nacos 在 MySQL 下用INSERT ... ON DUPLICATE KEY UPDATE实现“存在即更新”达梦不支持这个语法语句直接变成纯 INSERT第二次就撞唯一键了。解决把相关 SQL 改写成达梦的MERGE INTO语法。例如MERGE INTO config_info t USING (SELECT ? AS data_id, ? AS group_id, ? AS tenant_id FROM DUAL) s ON (t.data_id s.data_id AND t.group_id s.group_id AND t.tenant_id s.tenant_id) WHEN MATCHED THEN UPDATE SET t.content ?, t.gmt_modified SYSDATE WHEN NOT MATCHED THEN INSERT (data_id, group_id, tenant_id, content, gmt_create, gmt_modified) VALUES (?, ?, ?, ?, SYSDATE, SYSDATE);4.4 集群模式下节点间数据不同步现象Nacos 集群两个节点在节点 A 发布的配置节点 B 的控制台看不到。原因大概率是达梦的连接数不够或者事务隔离级别差异导致。Nacos 集群间通过数据库共享数据如果节点 B 的连接池拿不到连接查询就会失败但被降级处理表现为“看不到数据”。解决检查db.pool.config.maximumPoolSize是否够用集群模式下每个节点建议不低于 20。另外确认达梦的事务隔离级别是READ COMMITTED这是 Nacos 期望的默认级别。4.5 达梦驱动加载失败导致启动直接退出现象启动脚本执行后进程立刻退出日志里报ClassNotFoundException: dm.jdbc.driver.DmDriver。原因驱动 jar 没有正确放到 classpath或者loader.path配置的路径不对。解决确认plugins/dm/目录下有DmJdbcDriver18.jar且startup.sh里的loader.path指向的是绝对路径。可以在启动命令前加-verbose:class看类加载情况确认驱动类是否被扫描到。5. 进阶让Nacos在达梦上跑得更稳的几个技巧5.1 用达梦的AWR报告定位慢SQLNacos 在达梦上跑起来之后性能问题往往出在几条高频 SQL 上。达梦提供了类似 Oracle AWR 的性能诊断工具可以通过V$SQL_HISTORY和V$SESSION视图找到执行时间最长的 SQL。我一般会先跑这样一条查询找出 Nacos 相关的高频慢 SQLSELECT sql_text, exec_time, executions FROM V$SQL_HISTORY WHERE sql_text LIKE %config_info% ORDER BY exec_time DESC LIMIT 10;如果发现config_info的模糊查询慢可以在data_id和group_id上建复合索引。达梦的索引创建语法和 MySQL 基本一致CREATE INDEX idx_config_dataid_group ON config_info(data_id, group_id);5.2 连接池参数的达梦调优经验值经过几个项目的验证下面这组连接池参数在达梦 DM8 Nacos 2.x 的组合下比较稳参数建议值说明maximumPoolSize20单节点集群按节点数倍增minimumIdle5保持最小空闲连接connectionTimeout30000达梦建连较慢不低于30秒idleTimeout600000空闲回收时间maxLifetime1800000连接最大存活时间30分钟validationQuerySELECT 1 FROM DUAL达梦的验证语句特别提醒validationQueryMySQL 下写SELECT 1就行达梦要求FROM DUAL不写会报语法错误导致连接池健康检查失败。5.3 从MySQL迁移已有数据到达梦的实操步骤如果 Nacos 已经在 MySQL 上跑了一段时间迁移时不能只建空表还得把存量配置数据搬过去。我一般用这个流程第一步在 MySQL 上导出数据为 CSV 或 SQL 插入语句。第二步用达梦的数据迁移工具 DTS 或者手工改写 INSERT 语句导入。注意时间字段格式MySQL 的datetime导出来是2024-01-15 10:30:00达梦能直接识别。第三步导入后核对行数-- MySQL侧 SELECT COUNT(*) FROM config_info; -- 达梦侧 SELECT COUNT(*) FROM config_info;两边数字一致后再切换 Nacos 的数据源配置。切换前建议停写几分钟避免迁移过程中有新配置写入导致遗漏。5.4 一个容易被忽略的字符集问题达梦建库时如果字符集选了GBKNacos 里存储中文配置内容会出现乱码。这个问题在测试环境不一定暴露因为测试配置往往是英文的。上线后用户写中文配置就翻车了。确认字符集的方法SELECT UNICODE_TYPE FROM V$INSTANCE;返回UTF8才正常。如果是GBK要么重建库要么在 Nacos 连接 URL 上加字符集参数试试但根治还是重建。这个坑我在一个项目上线当天遇到过后悔药没得吃只能连夜导数据重建。5.5 升级Nacos版本时怎么保住达梦适配Nacos 版本升级时官方不会维护达梦的适配代码所以每次升级都要重新打补丁。我的习惯是把达梦适配的改动集中管理建表脚本单独放一个dm-schema.sql分页和 upsert 的源码改动用 git patch 文件记录升级时先合官方代码再 apply patch。具体操作上维护一个dm-adaptation.patch每次升级后执行git apply dm-adaptation.patch如果官方改了相关文件导致 patch 冲突就手动合并。这样比每次重新改一遍源码靠谱得多。另外建议把达梦驱动 jar 也纳入版本管理避免换台机器就找不到驱动。这套方案我已经在三个信创项目里落地过最长的稳定跑了两年多。核心经验就是建库时把大小写和字符集定对分页和 upsert 的 SQL 改到位驱动和连接池参数调稳剩下的就是常规运维了。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站