MySQL 8.0+下root用户登录异常求助:重置密码后仍提示无密码访问被拒
解决MySQL 8.0+重置root密码后登录失败(Access denied with using password: NO)的问题
这个问题我之前帮同事排查过,在MySQL 8.0+里太常见了——核心原因是你用了旧版本的密码重置命令,再加上8.0对认证机制做了大改动,才导致登录失败。咱们一步步来解决:
为什么你的操作会出错?
PASSWORD()函数已被彻底移除:MySQL 8.0+淘汰了旧的PASSWORD()加密函数,默认改用caching_sha2_password作为认证插件。你用UPDATE set authentication_string=PASSWORD("password")这条语句,不仅不会生成正确的密码哈希,还可能把authentication_string字段搞成无效值。- 登录命令的潜在格式问题:如果你的登录命令写成
mysql -u root -p password(注意-p和密码之间有空格),MySQL会把password当成要连接的数据库名,而非密码,这时候就会抛出using password: NO的错误。不过看你描述是-ppassword,那主要问题还是密码重置的方式不对。
正确的密码重置步骤
1. 停止MySQL服务
先把正在运行的MySQL服务停掉:
- Linux/macOS:执行
sudo systemctl stop mysql - Windows:在「服务」面板里找到MySQL服务停止,或者用命令行执行
net stop mysql
2. 跳过权限验证启动MySQL
启动时加上跳过权限表的参数,这样无需密码就能登录:
- Linux/macOS:
sudo mysqld_safe --skip-grant-tables & - Windows:进入MySQL的bin目录(比如
C:\Program Files\MySQL\MySQL Server 8.0\bin),打开命令提示符执行mysqld --skip-grant-tables
3. 无密码登录MySQL
打开新的终端/命令提示符,执行:
mysql -u root
这时候应该能顺利进入MySQL控制台。
4. 重置root密码(推荐用ALTER USER命令)
MySQL 8.0+推荐用ALTER USER来修改密码,比UPDATE更安全可靠:
- 先切换到mysql系统数据库:
USE mysql;
- 如果执行修改命令时提示
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement,先刷新权限:
FLUSH PRIVILEGES;
- 执行修改密码的命令(把
your_new_password换成你要设置的密码):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_password';
要是你非要用UPDATE语句,记得不能用PASSWORD(),得用SHA2生成符合要求的哈希:
USE mysql; UPDATE user SET authentication_string = SHA2('your_new_password', 256) WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES;
5. 重启服务并验证登录
先停止当前跳过权限的MySQL进程,再正常启动服务:
- Linux/macOS:
sudo systemctl restart mysql - Windows:
net start mysql
然后用正确的命令登录:
mysql -u root -pyour_new_password
或者更安全的方式,分开输入密码:
mysql -u root -p
然后按提示输入密码,这时候就能正常登录了。
内容的提问来源于stack exchange,提问作者Shivani Singhal




