解决docker中Nacos外置mysql数据库时出现No DataSource set
目录
一、问题描述:
二、原因如下:
2. 数据库连接池未建立成功,DataGrip触发了网络/连接状态更新
3. 表结构或数据库权限未初始化,DataGrip 的查询触发了元数据缓存
三、总结
一、问题描述:
首先我们在cmd中执行docker run 命令,如图:
可以看到我们是正常创建了容器的,以及在这之前我已经将sxp-mysql加入到了elm-network中,所以通过容器名来进行访问也是没什么问题的,同时我提前在mysql中创建了对应的database,如下图(建表的sql参考github )
但是在docker desktop中查看nacos状态的时候会发现,nacos启动过程一直报错,显示No DataSource set,也就是说找不到数据源。
最开始我以为是我开了vpn的问题,导致网络出现了问题,访问不到数据库,然后我关了数据库发现于事无补。在重试了许多次删除容器,重新创建容器run后,一次偶然,nacos正常运行了,但是我不是很清楚原因,我只知道我是进行了一次对应database的sql查询。然后我去网上搜索原因,恍然大悟。
二、原因如下:
1. 数据库容器懒加载机制:初次连接时才真正“就绪”
-
很多 MySQL Docker 镜像(尤其是自定义或基于云平台的)在没有任何连接请求时处于“初始化未完成/未唤醒”状态。
-
DataGrip 的查询操作让数据库真正完成初始化,让数据库对外服务端口开放、状态 READY。
-
Nacos 在未连上数据库时会报
No DataSource set
,此时一查数据库,它“苏醒了”,Nacos 再重试连接就能连上了。
2. 数据库连接池未建立成功,DataGrip触发了网络/连接状态更新
-
MySQL 容器网络与 Nacos 容器在 Docker bridge 模式下可能在启动初期不稳定;
-
DataGrip 发起一次连接,实际完成了 DNS 解析 + TCP 握手,使得网络路由表建立起来;
-
这使得 Nacos 之后尝试连接时不再失败。
3. 表结构或数据库权限未初始化,DataGrip 的查询触发了元数据缓存
-
某些 MySQL 镜像或数据库中间件(如阿里云RDS)在表结构未被访问时不会初始化完整的元信息;
-
第一次手动查询,触发了元信息构建,之后 Nacos 能正常
SELECT
、INSERT
; -
尤其是在开启了某些“lazy metadata”或“performance_schema”优化时,这种现象更明显。
三、总结
使用的nacos外置了mysql数据库,而这个mysql数据库是部署到docker容器中的,他可能会采取一种类似于懒加载的模式,也就是如果没有一次访问数据库驱动的查询或者其他语句时,数据库的结构那些不会进行初始化,那么启动的nacos在寻找mysql中的elm-nacos-local这个database时会出现找不到的情况,解决方式就是先在docker中或者连接好的datagrip中使用mysql执行一次查询语句,然后再使用docker run命令启动nacos容器即可。