Nacos报错内容
shell
Nacos Server did not start because dumpservice bean construction failure : No DataSource set
原因分析
Nacos 配置的是单机模式,使用mysql 进行存储配置文件,Nacos的启动脚本已经配置了MySQL的连接方式,根据错误提示,应该是数据库的问题,重点排查MySQL的服务是否正常
排查MySQL可能存在的问题
确保Mysql已经启动
Mysql服务也是通过docker 的方式启动
查看docker 服务
shell
docker ps
登录MySQL容器
shell
docker exec -it <容器名称|容器id> /bin/sh
发现MySQL服务正常启动,也可以正常进入docker 容器
确保Mysql账号可以远程访问
登录MySQL
bash
mysql -u root -p
输入密码
选择 mysql 数据库
shell
use mysql;
因为 mysql 数据库中存储了用户信息的 user 表。
查看当前用户的相关信息
shell
select host, user, authentication_string, plugin from user;
确保IP可以访问
shell
ping <IP>
确保端口可以访问
shell
telnet <IP> <PORT>
排查Nacos可能存在的问题
是否正确设置环境变量
特别是以下环境变量:
MYSQL_SERVICE_HOST
:MySQL数据库的主机名或IP地址。MYSQL_SERVICE_PORT
:MySQL数据库的端口号。MYSQL_SERVICE_USER
:连接数据库的用户名。MYSQL_SERVICE_PASSWORD
:连接数据库的密码。MYSQL_SERVICE_DB_NAME
:要使用的数据库名称。
确保这些环境变量的值正确地对应你的MySQL数据库配置。
是否设置超时时间
Nacos启动脚本增加,以下配置
shell
-e NACOS_SERVER_TIMEOUT=5000
重启Nacos服务,还是报错
设置MySQL连接参数
shell
-e MYSQL_SERVICE_DB_PARAM='characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=UTC'
重启Nacos服务,依旧报错
问题分析
根据报错的内容,一直觉得是MySQL的问题,可以发现MySQL是正常启动的,于是开始怀疑的Nacos的问题,而Nacos经过一系列的排查,也没有发现问题,到底是什么原因造成的呢?
最后把问题重新回到MySQL的上面,继续在MySQL上面找原因,由于把MySQL升级到了最新版,是不是因为升级MySQL造成的问题呢,对比MySQL旧版本存储数据,发现是MySQL加密插件的问题,那么问题就好解决了,只需要把加密插件修改为之前的就可以了
问题解决
修改MySQL密码并指定加密插件
shell
# 使用mysql数据库
use mysql;
# 修改MySQL密码并指定加密插件
alter user 'root'@'%' identified with mysql_native_password by 'root';
# 刷新使其生效
flush privileges;
# 查询修改后的数据
select host,user,plugin,authentication_string from mysql.user;
这里将MySQL的密码设置为root,具体使用时,可以根据需要修改。
文档参考
在MySQL中,mysql.user表是存储用户信息的系统表之一。该表中的plugin字段表示用户所使用的身份验证插件。
- caching_sha2_password:这是MySQL 8.0版本引入的默认身份验证插件。它使用SHA-256算法对密码进行加密,并将加密后的密码存储在mysql.user表中。这种插件提供了更强大的安全性,因为它使用了更强大的加密算法。
- mysql_native_password:这是MySQL早期版本中使用的默认身份验证插件。它使用SHA-1算法对密码进行加密,并将加密后的密码存储在mysql.user表中。然而,SHA-1算法已经被认为不够安全,因此在MySQL 8.0版本中被caching_sha2_password取代。
当MySQL的用户使用caching_sha2_password作为身份验证插件时,可能会遇到无法通过外部访问的问题。这是因为caching_sha2_password插件要求客户端使用SSL/TLS加密连接到MySQL服务器。如果客户端没有使用SSL/TLS加密连接,MySQL服务器将拒绝连接请求。
这种限制是为了增加数据传输的安全性。通过使用SSL/TLS加密连接,可以防止密码在传输过程中被窃取或篡改。