MySQL Access denied for user ‘root‘@‘localhost‘ (using password: YES/NO) 的原因以及解决方案

当遇到MySQL登录错误'Access denied for user 'root'@'localhost'时,通常是由于密码错误或权限设置不当导致。本地和远程密码可能不同,无密码登录在某些情况下是允许的。解决方法包括通过安全模式重置密码,或者根据MySQL版本执行特定的更新命令。记得在更新密码后重启服务并验证新密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Access denied for user 'root'@'localhost' (using password: YES/NO) 的原因以及解决方案

这个错误我想应该是比较常见的一种错误了,但,出现错误并不可怕,可怕的是你并不知道原因,从而不知道如何解决问题。

Access denied for user 'root'@'localhost' (using password: YES/NO),还是先翻译一下比较好,意思为无权限使用root账号本地登录MySQL, 说人话,就是密码校验未通过,括号内是:使用密码:是/不是。

注:MySQL的密码可以分为两种,一种是本地使用的,一种是远程使用的,比如,root账号,本地密码设置的有,但远程的密码没有设置,也是可行的,当然,远程的密码也可以设置的和本地的密码不一样,但一般遵从大家的习惯,两者密码一般设置的是一样的那么,如果远程密码没有设置,或者输入的是本地密码(本地和远程密码设置的不同的时候)远程登录的时候必定会报以上错误,因为服务器会一直校验密码,除非你在配置文件里关闭密码校验这个机制。

(以上比较拗口,但这些就是登陆问题出现的原因)

本地MySQL密码和远程MySQL密码不是一回事

如果安装完MySQL后直接初始化(也就是mysql_secure_installation),然后本地登录MySQL,执行提权给予远程权限,命令通常是这个,此时远程连接不需要密码就可登录:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;

 如果本地登录MySQL,执行提权给予远程权限,并附带密码,此密码是可以和本地密码不一样的:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' identified by 'ewrwerwe' WITH GRANT OPTION;

下面举一些例子 



例如下图是本地登录,也就是MySQL客户端和服务器是在一个服务器内的情况:

这里,我是没有输入密码直接回车的,因此,()内告诉我,我没有使用密码登陆,但这个数据库是需要密码校验的,校验并没有通过。登陆形式是root用户本地登陆

这里,我输入了一个错误的密码,因此,()内告诉我,我使用了密码,括号前告诉我,密码校验没有通过,登陆形式是root用户本地登陆



那么,我远程登录会是什么提示呢(远程登录指的是MySQL客户端和MySQL服务器不在一个服务器内,很显然,这里我的MySQL客户端就是Navicat,MySQL服务器是在Linux内,因此,是远程通过socket文件连接的)(密码乱输的,是肯定错误的)(翻译一哈就是用户root密码校验未通过,使用了密码,MySQL客户端是192.168.217.1)

 那么,不输入密码,直接远程登录会是什么样的呢?Navicat会告诉我,你在192.168.217.1这个服务器上使用Navicat登录192.168.217.18,开放了端口3306的MySQL服务器,但你没有使用密码。BUT,远程的密码是有设置的,因此,密码校验未通过

 这里是很显然的空密码(模拟忘记输密码的情况吧),Navicat告我没有使用密码(NO了嘛)就通过192.168.217.1这个服务器上的客户端登录192.168.217.18服务器,但,此远程服务器有密码,因此,密码校验未通过,登录失败。

小结一哈:

  • 首先,应该了解MySQL可以无密码登录的,但是,通常是使用密码校验的,因此,在执行登录命令:mysql -uroot -p 的时候,报错提示会记录你是否使用了密码,并且密码校验是否通过。
  • 其次,MySQL的登录分为远程登录和本地登录,localhost表示本地,通常的,安装完MySQL,root用户时默认的拥有权限本地登录的,但远程登录权限是关闭的,这么做的目的是保护MySQL的安全(如果有人恶意的远程登录你的MySQL是不是很恐怖??)。

那么,假设在一个正常的已安装完的MySQL,你如果输入的是不正确的密码,它就会报这个错了(很可能本地和远程的密码设置的是不一样的),根本原因就是密码错误,校验未通过,直到输入正确的密码,当然,密码不正确大部分是因为忘记了,因此,重置密码是比较快速的方案(重置密码会统一本地和远程的密码成一样的因此,通常只要重置密码就会顺利登录。 )

解决方案根据MySQL的版本分两种,mysql5.6.5之前的版本算低版本,之后的版本为高版本(MySQL密码的记录方式改变了,导致更改密码的方式改变了)。

mysql5.6.5版本之前的更新重置密码操作:

1,停止MySQL服务,

停止的方式很多,按安装方式来说,yum 安装方式:systemctl stop mysql #systemd管理方式

二进制以及编译安装方式:service mysqld stop# chkconfig的管理方式,是centos6的方式,目前centos7还是兼容的

2,MySQL安全模式带忽略密码校验参数启动

mysqld_safe --skip-grant-tables --skip-networking& #后台运行模式,否则需要新开窗口,那就会多很多事了 ,对吧,--skip-grant-table是密码不校验,--skip-networking意思是不监听端口,即使MySQL指定了端口监听,&是后台运行的意思

示例:

[root@centos11 ~]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking&
[1] 2195
[root@centos11 ~]# 2025-02-08T15:18:48.680920Z mysqld_safe Logging to '/usr/local/mysql/data/centos11.err'.
2025-02-08T15:18:48.699901Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

3,无密码方式本地登录MySQL,SQL语句更新root密码,从而重置密码。(密码校验功能已关闭了)

示例如下:

[root@centos11 ~]# mysql -uroot -h localhost   -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.43 MySQL Community Server (GPL)

此时是不需要任何密码就可以进入MySQL了 

update user set Password=PASSWORD('你要重置的新密码') where user='root';

flush privileges;#刷新权限表

4,结束msyqld_safe进程,也就是退出安全模式,然后以正常模式启动MySQL,输入重置的密码,验证密码的正确性

[root@centos11 ~]# ps aux |grep mysql
root       2195  0.0  0.0 113316  1600 pts/0    S    23:18   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking
mysql      2387  0.0  4.7 1187948 191828 pts/0  Sl   23:18   0:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=centos11.err --pid-file=centos11.pid --port=13306
root       2421  0.0  0.0 112712   956 pts/0    S+   23:28   0:00 grep --color=auto mysql
[root@centos11 ~]# kill -9 2387
[root@centos11 ~]# /usr/local/mysql/bin/mysqld_safe: line 198:  2387 Killed                  nohup /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=centos11.err --pid-file=centos11.pid --port=13306 < /dev/null > /dev/null 2>&1
2025-02-08T15:28:37.090088Z mysqld_safe Number of processes running now: 0
2025-02-08T15:28:37.093333Z mysqld_safe mysqld restarted

mysqld_safe的进程影响MySQL正常使用吗?大概是不影响的

systemctl restart mysql#重启服务   或者    service mysqld restart#重启服务

mysql -uroot -p你的新密码  #-p后没有空格,直接接密码。正常进入MySQL表示密码更新完成,此时还需要验证一下远程连接是否正常:

下面是两个连接,一个是本地连接,这里不需要指定端口,如果端口改变过监听,第二个是远程连接,这里是改变监听端口为13306了

[root@centos11 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ^DBye
[root@centos11 ~]# mysql -uroot -h 192.168.123.11 -P13306 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

远程连接不指定端口将会报错了:

[root@centos11 ~]# mysql -uroot -h 192.168.123.11  -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.123.11' (111)

mysql5.6.5版本之后的更新重置密码操作:

1,2,4步都和上面的一样,第三步需要改变一下:

[root@centos11 ~]# mysql -uroot -h localhost   -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> update mysql.user set authentication_string=PASSWORD('要设定的密码') where USER='root';
Query OK, 2 rows affected, 1 warning (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 1

这里需要注意,最后输出是有两个匹配,两个改变 ,一个警告,也就是Rows matched: 2  Changed: 2  Warnings: 1

两个改变说的是本地和远程的root用户的密码都更改为统一的一个密码了

总结:

MySQL和mariadb版本比较多,高版本密码的设定需要改变,先停止MySQL服务,在进入安全模式是必须的,尽量不要修改my.cnf文件(很多别的文章就是修改my.cnf,这是不建议的行为,因为如果忘记修改回来会出大问题的。),权限表的刷新也别忘了,其实MySQL内的那个privilege表你也刷不坏,放心刷就行了 。

评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风_END

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值