暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL运维实践|稀里糊涂的解决了MySQL子账号过期、密钥问题

引言

好久没有启动nacos,前几日服务器磁盘列卡损坏,等待了一日,故障服务器已经恢复正常使用,可我的nacos还需要手工启动,在我启动时给出了下面的错误信息。

Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
	……省略部分日志……
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
	at com.alibaba.nacos.persistence.utils.ConnectionCheckUtil.checkDataSourceConnection(ConnectionCheckUtil.java:40)
	... 124 common frames omitted
Caused by: com.mysql.cj.exceptions.CJException: Public Key Retrieval is not allowed
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	……省略部分日志……
	at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839)
	... 136 common frames omitted
Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
		……省略部分日志……
	at com.mysql.cj.protocol.a.authentication.CachingSha2PasswordPlugin.nextAuthenticationStep(CachingSha2PasswordPlugin.java:130)
	... 142 common frames omitted
2025-01-20 14:02:46,520 WARN [WatchFileCenter] start close

2025-01-20 14:02:46,521 WARN [WatchFileCenter] start to shutdown this watcher which is watch : .../xxx/software/nacos/2.4.0/nacos/conf

2025-01-20 14:02:46,521 WARN [WatchFileCenter] already closed

从上面的信息中我提取三个有用的信息:

1、Could not create connection to database server. Attempted reconnect 3 times. Giving up.:无法创建与数据库服务器的连接。尝试重新连接3次,放弃。

2、com.mysql.cj.exceptions.CJException: Public Key Retrieval is not allowed:com.mysql.cj.exceptions.CJException:不允许进行Public Key检索。

3、开始停止监控,路径xxx: start to shutdown this watcher which is watch : .../xxx/software/nacos/2.4.0/nacos/conf


问题排查

关于上述三个有效信息一开始我是没有仔细阅读,这三个信息都将错误的意图指向MySQL服务器。

首先,MySQL服务器不是我的,想着只是换了磁盘,并不影响我重启组件服务,也就没有在意。

其次,这些组件和服务一直在使用,不可能因为重启就出现异常错误,照例再来一遍。

最后,我发现自己错了,我没有更改信息,并不代表其他开发人员没有修改或者更改信息。


Public Key not allowed配置

这是关于问题2带来的解决办法,这是由于 MySQL 连接驱动程序的默认行为更改所引起的,在 MySQL 8.0 + 版本中,默认情况下禁用了通过公钥检索用户密码的功能。旧版本的 MySQL 中,客户端连接到服务器时,可以使用公钥来检索用户密码。这种机制称为 “public key retrieval”,它允许客户端使用公钥来解密在服务器端加密的密码。

此时,我们更改nacos的连接mysql的配置即可,在 application.properties 文件的 db.url.0 的值中增加 &allowPublicKeyRetrieval=true 配置即可。还有一点就是在nacos的yaml文件中也需要配置此项,启动微服务模块依旧也需要这个模样配置。

db.url.0=jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true


MySQL 授权查询

我以为是授权问题,就查询了业务账号的授权相关信息,从授权信息中也没有看出来有什么问题。

show grants for 'test01';

---------------------------
GRANT USAGE ON *.* TO `test01`@`%`
GRANT ALL PRIVILEGES ON `db_001`.* TO `test01`@`%` WITH GRANT OPTION
GRANT ALL PRIVILEGES ON `db_002`.* TO `test01`@`%` WITH GRANT OPTION
GRANT ALL PRIVILEGES ON `db_003`.* TO `test01`@`%` WITH GRANT OPTION
GRANT ALL PRIVILEGES ON `db_004`.* TO `test01`@`%` WITH GRANT OPTION
GRANT ALL PRIVILEGES ON `db_005`.* TO `test01`@`%` WITH GRANT OPTION

MySQL子账号过期查询

我连接时习惯使用子账号作为业务账号,此时我使用root账号登录时可以登录,子账号无法登录。一开始我以为是账号过期了。我使用root账号的登录后,查询子账号的密码是否过期、密码上次更改时间(由于我已经更改,下面查询出来的是更改密码后的时间,当时查询出来的结果是没有过期,也没有更改过密码),就是提示无法登录,我使用客户端和在服务器尝试都无法登录。在MySQL数据库中,用户账户的管理是一个重要的任务,为了提高数据库的安全性和管理效率,管理员需要定期检查和更新用户账户的有效期,由于是本地中账号,就没有过多打理。

select user, password_expired, password_last_changed 
from mysql.user where user = 'test01';

---------------------------------------------
test01	N	2025-01-20 15:09:53

关于MySQL账号问题,可以在系统管理表mysql.user中查询。


mysql.user表存储了MySQL用户的信息,包括用户名、主机、密码哈希值、账户过期时间等。我本次排查相关的字段包括:

  • User:用户名。
  • Host:用户登录的主机。
  • password_expired:密码是否过期。
  • password_last_changed:密码上次修改时间。
  • password_lifetime:密码有效期(天数)。

其他字段可以根据需要了解即可,使用频率不是很高,除非你是运维监控,一般开发者很少用到。

尝试修改密码

我也没看出来啥问题,到此处就想着修改下密码吧,就知行命令就开始修改密码。


alter user 'test01'@'%' identified by 'test01@20250120';

flush privileges;

再次启动nacos,……,此处等待一些时间,呀呼嘿,nacos居然启动了,神奇了。~ 说实话,我也没有找到具体原因,除了问题2是一个已知问题。

总结

好了,昨日遇到的问题就记一个流水账了,虽然不知道问题具体的原因,但是可以解决问题就权当又学习了。后续有时间再来详细学习下具体的源码吧。这也许是中国新年的前的最后一篇,在这里祝福大家新年快乐,蛇年大吉。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论