You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

按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),单独修改该账号的密码。

四、走一遍完整的标准重置流程(确保每一步都没漏)

如果上面的方法都不行,直接重新走一遍最稳妥的流程:

  1. 彻底停止MySQL服务:确保没有残留进程,避免冲突
  2. 启动MySQL并跳过权限表
    • Linux:
      sudo mysqld_safe --skip-grant-tables --skip-networking &
      
    • Windows(命令行必须以管理员身份运行):
      net stop MySQL
      mysqld --skip-grant-tables
      
  3. 无密码登录MySQL
    mysql -u root
    
  4. 根据你的MySQL版本修改密码:(参考前面的版本对应语句)
  5. 刷新权限:这一步很关键,不然修改不会生效
    FLUSH PRIVILEGES;
    
  6. 退出MySQL
    exit;
    
  7. 彻底停止MySQL并正常启动:一定要关掉跳过权限的参数
  8. 用新密码登录
    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

火山引擎 最新活动