遇到 Nacos 配置 MySQL 持久化后启动报 Access denied,绝大多数情况是数据库账号密码配错、用户权限不足,或者 MySQL 8.0 以上版本的认证插件不兼容导致的。
先说结论:优先检查配置文件中的账号密码是否含特殊字符或空格,其次确认数据库用户是否有对应库的权限,最后排查 MySQL 版本与驱动兼容性。
- 先确认:配置文件 db.user 和 db.password 是否准确无误
- 先处理:在 MySQL 中重置用户权限或修改认证方式
- 再验证:查看 Nacos 启动日志确认连接状态
配置项完整示例
打开 conf/application.properties,确保包含以下核心配置。注意 URL 中的特殊字符需正确转义。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user=nacos
db.password=your_password安全提示:上述配置中 useSSL=false 仅适用于测试环境。生产环境建议配置证书开启 SSL,防止数据传输被窃听。
重启与生效验证
修改配置后需重启 Nacos 才能生效。根据部署模式执行不同命令:
# 单机模式
sh startup.sh -m standalone
# 集群模式
sh startup.sh重启后观察 logs/startout.log 或 logs/nacos.log。
错误日志特征
如果权限配置错误,日志中通常会出现类似以下片段:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user 'nacos'@'192.168.1.5' (using password: YES)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)看到 Access denied for user 字样,即可确认是数据库认证环节问题。
数据库权限修复命令
如果你需要快速重置数据库用户权限,可以登录 MySQL 后执行以下 SQL 语句。注意将 'nacos' 和 'your_password' 替换为实际值。
CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nacos'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;如果是 MySQL 8.0 以上版本,可能需要修改认证插件为 mysql_native_password:
ALTER USER 'nacos'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';为什么会这样
Nacos 启动时会读取 conf/application.properties 中的数据库配置,尝试建立连接。Access denied 是 MySQL 服务端返回的标准错误,意味着连接请求被拒绝。常见原因有三点:一是配置文件里的密码写错了,比如多了空格;二是数据库用户存在,但没有访问特定数据库的权限;三是 MySQL 8.0 默认使用了 caching_sha2_password 认证插件,而旧版 JDBC 驱动不支持,导致握手失败。
分步处理
第一步:检查配置文件
打开 Nacos 安装目录下的 conf/application.properties 文件。找到 spring.datasource.platform=mysql 相关的配置项。重点检查 db.user 和 db.password。有时候复制粘贴会带入不可见的空格,建议手动重新输入一次。如果密码包含特殊字符(如 @、#),尝试用引号包裹或进行 URL 编码,但在 properties 文件中通常直接填写即可,注意不要有多余空格。
第二步:验证数据库连接
不要在 Nacos 服务器上猜,直接在能连通数据库的机器上用命令行测试。使用配置的账号密码尝试登录 MySQL。如果命令行都登不上,说明账号密码或权限确实有问题,先修数据库,再修 Nacos 配置。
第三步:检查 JDBC 连接 URL
查看配置中的 db.url.0。对于 MySQL 8.0+,建议在连接串末尾加上 allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai。缺少公钥检索参数在高版本 MySQL 中也会引发连接被拒。
怎么验证是否生效
修改配置后重启 Nacos。观察 logs/startout.log 或 logs/nacos.log。如果启动成功,日志中不会出现 Database exception 或 Access denied 字样,且会显示 Nacos 开始加载配置数据。你也可以登录 MySQL,执行 SHOW PROCESSLIST; 查看是否有来自 Nacos 服务器 IP 的连接处于 Sleep 或 Query 状态。
常见坑
1. 密码特殊字符:如果密码中包含 @,而在 URL 中未编码,可能被解析为主机分隔符。但在 properties 的 db.password 字段中通常直接写即可,主要注意 URL 中的编码。
2. 主机限制:创建用户时使用的是 'nacos'@'localhost',但 Nacos 部署在另一台机器,导致远程连接被拒。建议创建 'nacos'@'%' 或指定具体 IP。
3. 驱动版本:Nacos 自带驱动可能较旧,如果 MySQL 版本很高,建议优先升级 Nacos 版本以获取最新驱动,避免手动替换内部依赖导致版本兼容性问题或升级困难。
4. 配置文件缓存:修改完 application.properties 后,确保重启的是生效的进程,有时候后台残留旧进程会导致配置未加载。