Laravel应用中MySQL 8每隔5个月出现root本地访问拒绝问题咨询
问题分析与解决建议
核心原因:大概率是密码过期导致
MySQL 8 默认的密码过期策略是180天(约5个月),刚好和你遇到的复发周期吻合。当密码过期后,即使用户输入正确密码也会触发Access denied错误,而你执行的重置命令相当于重新设置了密码并刷新了过期状态,所以能暂时解决问题。
验证方法
登录MySQL后执行以下命令,查看root@localhost用户的密码过期相关状态:
SELECT user, host, password_expired, password_lifetime FROM mysql.user WHERE user = 'root' AND host = 'localhost';
- 如果
password_expired值为Y,说明密码确实已过期; password_lifetime值若为180,则是使用了默认的过期周期。
永久解决方法
方法1:单独设置该用户密码永不过期
执行以下SQL命令(替换your_password为实际密码):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password' PASSWORD EXPIRE NEVER; FLUSH PRIVILEGES;
方法2:修改全局密码过期策略(影响所有用户)
- 打开MySQL配置文件(Linux通常是
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,Windows是my.ini); - 在
[mysqld]段添加或修改:default_password_lifetime = 0 # 0表示永不过期,也可设置具体天数如365 - 重启MySQL服务:
sudo systemctl restart mysql # Linux # Windows可通过服务管理器重启MySQL服务
其他排查方向
如果确认不是密码过期问题,还需检查以下两点:
- Laravel配置是否被篡改:检查
.env文件中的DB_PASSWORD是否与MySQL中root用户的密码一致,避免配置文件被意外修改; - 认证插件是否被重置:MySQL 8 默认使用
caching_sha2_password插件,部分场景(如MySQL升级、配置重置)可能会将用户的认证插件改回默认值。执行以下命令确认插件类型:
确保SELECT user, host, plugin FROM mysql.user WHERE user = 'root' AND host = 'localhost';plugin值为mysql_native_password,如果不是,重新执行你之前的重置命令即可。
内容的提问来源于stack exchange,提问作者ZayR
相关产品推荐
相关产品推荐

