按MySQL官方文档修改root密码时Step6出现Access is denied错误求解决
解决MySQL修改root密码时Step6出现Access Denied的方案
嘿,我碰到过不少开发者卡在这个步骤,大多是因为版本适配的语法错误或者重启时没清理跳过权限的参数,给你一步步拆解解决:
一、先确认你用对了对应MySQL版本的密码修改语句
MySQL 5.7和8.0+的密码更新逻辑差很多,用错语句等于白改:
如果你用的是MySQL 5.7及更早版本
在跳过权限表登录后,必须用这个语句:
UPDATE mysql.user SET Password=PASSWORD('你的新密码') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;
划重点:5.7里密码字段是
Password,必须用PASSWORD()函数加密,不然密码不会生效。
如果你用的是MySQL 8.0及以上版本
8.0直接废掉了PASSWORD()函数,密码字段也改成了authentication_string,正确操作是:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
如果执行ALTER USER时报错,先执行
FLUSH PRIVILEGES;再试,或者走这个兜底流程:UPDATE mysql.user SET authentication_string='' WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
二、重启MySQL时一定要关掉跳过权限表的参数
很多人修改完密码后,重启MySQL时忘了去掉--skip-grant-tables参数,导致MySQL根本没加载权限表,这时候不管输什么密码都会被拒。
正确的重启方式:
- Linux系统:
# 先彻底停掉服务 sudo systemctl stop mysqld # 正常启动(别加任何跳过权限的参数) sudo systemctl start mysqld - Windows系统:
打开服务管理器(右键此电脑→管理→服务),找到MySQL服务,先停止,再启动,确保启动时没加载自定义的跳过参数。
三、检查是否存在多个root账号
MySQL的用户是「用户名@主机」的组合,可能同时存在root@localhost(本地登录用)、root@%(远程登录用)等不同账号,你修改的可能不是当前尝试登录的那个。
登录跳过权限表的MySQL后,执行这条命令看看所有root账号:
SELECT User, Host FROM mysql.user WHERE User='root';
然后针对你要使用的主机(比如本地登录就改root@localhost),单独修改该账号的密码。
四、走一遍完整的标准重置流程(确保每一步都没漏)
如果上面的方法都不行,直接重新走一遍最稳妥的流程:
- 彻底停止MySQL服务:确保没有残留进程,避免冲突
- 启动MySQL并跳过权限表:
- Linux:
sudo mysqld_safe --skip-grant-tables --skip-networking & - Windows(命令行必须以管理员身份运行):
net stop MySQL mysqld --skip-grant-tables
- Linux:
- 无密码登录MySQL:
mysql -u root - 根据你的MySQL版本修改密码:(参考前面的版本对应语句)
- 刷新权限:这一步很关键,不然修改不会生效
FLUSH PRIVILEGES; - 退出MySQL:
exit; - 彻底停止MySQL并正常启动:一定要关掉跳过权限的参数
- 用新密码登录:
输入新密码后应该就能正常登录了。mysql -u root -p
五、特殊情况:如果是远程登录被拒
如果你是远程连接MySQL时出现Access denied,除了上面的步骤,还要注意:
- 你修改的是
root@%这个允许远程访问的root账号的密码 - MySQL配置文件(my.cnf/my.ini)里没有设置
bind-address=127.0.0.1(如果需要远程访问,改成0.0.0.0或者直接注释掉) - 服务器防火墙允许3306端口的入站访问
内容的提问来源于stack exchange,提问作者Hash




