用户'root'@'localhost'访问被拒绝(使用密码:是)- 没有权限?

217

我一直收到这个错误。

我正在使用mySQL Workbench,发现root的模式权限为空。没有任何权限。

我的服务器在不同平台上都出现了问题,这是突然出现的问题。

root@127.0.0.1显然拥有很多访问权限,但我以该用户登录,但它仍然只分配给本地主机 - 本地主机没有权限。

我已经做了一些事情,如FLUSH HOSTSFLUSH PRIVILEGES等,但是从那以后或者说从互联网上都没有找到成功的方法。

如何恢复root的访问权限?我感到沮丧,因为当我四处看看时,人们都指望你“拥有访问权限”,但我没有访问权限,所以无法进入命令行或其他任何东西,并且不能给自己授权 GRANT

运行SHOW GRANTS FOR root时,返回以下内容:

  

错误代码:1141。 用户'root'在主机'%'上没有定义这样的授权


在查询中运行 SHOW GRANTS FOR root,并将结果发布在您的问题中。 - NobleUplift
你是想从本地主机或使用MySQL Workbench从另一台主机访问数据库吗? - Andy Jones
使用 --skip-grant-table 选项重新启动服务器,并使用任何用户登录并为 root 提供完全权限,然后再次在不使用上述选项的情况下重新启动服务器。 - vidyadhar
@AndyJones 不是的,我正在使用一台专用服务器。 - Chase
问题不在于忘记密码,而是所有权限都设置为本地主机,而您正在尝试从另一台计算机(非本地主机)访问数据库。 - Andy Jones
显示剩余3条评论
28个回答

272

如果你在 MySql 5.7.+ 中遇到了同样的问题:

Access denied for user 'root'@'localhost'

这是因为MySql 5.7默认允许通过socket连接,这意味着您只需使用sudo mysql连接即可。 如果您运行sql:

SELECT user,authentication_string,plugin,host FROM mysql.user;

然后你就会看到它:

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *497C3D7B50479A812B89CD12EC3EDA6C0CB686F0 | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

为了允许使用root和密码进行连接,可以使用以下命令更新表中的值:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Current-Root-Password';
FLUSH PRIVILEGES;

然后再次运行选择命令,您会看到它已更改:

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *2F2377C1BC54BE827DC8A4EE051CBD57490FB8C6 | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *497C3D7B50479A812B89CD12EC3EDA6C0CB686F0 | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

就是这样。在运行并完成sudo mysql_secure_installation命令后,您可以运行此过程。

对于mariadb,请使用

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('manager');

设置密码。 更多信息请参见https://mariadb.com/kb/en/set-password/


1
在Linux Mint建立连接时,非常感谢。 - Lova Chittumuri
1
auth_socket更新到mysql_native_password解决了我的问题。谢谢! - olore
4
这真的让人十分恼火,费了大量时间才搞明白。我希望他们在 mysql_secure_installation 过程中问这个问题。非常感谢你提供的答案。 - PatPeter
我已经尝试过这个方法,表格的条目也以同样的方式更改了,但密码仍然无法使用。此外,“sudo mysql_secure_installation”也会提示输入密码。 - mr.loop
@mr.loop,这是在新安装的情况下,MySQL优先使用套接字身份验证而不是旧密码提示。在您的情况下,我不太清楚您的MySQL实例。如果有必要,您可能需要重置密码。 - KeitelDOG
显示剩余5条评论

65

请使用重置root密码的指南,但不要重置root密码,我们将强制向mysql.user表中插入一条记录。

在初始化文件中,请使用此选项代替。

INSERT INTO mysql.user (Host, User, Password) VALUES ('%', 'root', password('YOURPASSWORD'));
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;

1
抱歉Andy,但我遇到了一个问题,在第6步时一直无法解决。由于我使用了安装向导,因此我将使用以下命令: "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld.exe" --defaults-file="C:\\Program Files\\MySQL\\MySQL Server 5.6\\my.ini" --init-file=C:\\mysql-init.txt一切都在它应该在的地方,你上面提供的内容我已经相应地放入文件中了。我也停止了服务。但我只得到这个输出:http://prntscr.com/1ilxau而且所有东西(插件)都关闭了。真的很困惑。 - Chase
2
您以管理员身份运行此程序吗? - Andy Jones
2
令我惊讶的是,我的愚蠢并没有导致错误。在我意识到之后,我得到了这个http://prntscr.com/1imcnj - 第一次我把它放在他们自己的行上(从粘贴中),然后我把它全部放在一行上。 很抱歉,这对我来说太混乱了,我不是SQL专家。 - Chase
25
出现“ERROR 1054 (42S22): Unknown column 'Password' in 'field list'”错误。@AndyJones - alper
2
@AndyJones 请使用“Authentication_string”代替密码。 - omjego
显示剩余4条评论

63

由于我的用户特权不够,所以我使用SUDO。 (在bash中<< sudo设置用户名和密码) (这将给出root的用户名并将密码设置为空) (在Mac上)

sudo mysql -uroot -p

太好了!这个解决方案也适用于Ubuntu 20.04 LTS。 - Rohan Bari

33

尝试以下命令

~$ sudo /etc/init.d/mysql stop
~$ sudo mysqld_safe --skip-grant-tables &
~$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1 to server version: 4.1.15-Debian_1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

mysql> use mysql;

mysql> update user set password=PASSWORD("root") where User='root';

mysql> flush privileges;

mysql> quit

~$ sudo /etc/init.d/mysql stop

Stopping MySQL database server: mysqld

STOPPING server from pid file /var/run/mysqld/mysqld.pid

mysqld_safe[6186]: ended

[1]+  Done                    mysqld_safe --skip-grant-tables

~$ sudo /etc/init.d/mysql start

~$ mysql -u root -p

* MySQL Community Server 5.6.35 is started
~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

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> 

13
在MySQL 5.7版本中,mysql.user表中的密码字段已被移除,现在该字段名为“authentication_string”。 - Rumid
对于新版本的MySQL,他们将密码列名更改为authentication_string。 - Ramesh Maharjan
1
执行 sudo mysqld_safe 命令时,出现了 /var/run/mysqld for UNIX socket file don't exists 的错误提示。然后通过执行 mkdir -p /var/run/mysqldsudo chown -R mysql:mysql /var/run/mysqld/ 命令,问题得以解决并成功启动了守护进程。 - Sumit Wadhwa
1
错误 2002 (HY000):无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器 - Mostafa

26

对于在mysql 5.7+版本中遇到以下错误的人 -

Access denied for user 'root'@'localhost' (using password: YES)
  1. 打开新的终端

  2. sudo /etc/init.d/mysql stop ... MySQL Community Server 5.7.8-rc 已停止

  3. sudo mysqld_safe --skip-grant-tables & 这将跳过所有授权级别特权并以安全模式启动 MySQL 。 有时进程会因为

grep: 写入错误: Broken pipe 180102 11:32:28 mysqld_safe 日志记录到 '/var/log/mysql/error.log'。

只需按 Ctrl+Z 或 Ctrl+C 来中断和退出进程

  1. mysql -u root

欢迎使用 MySQL 监视器。 命令结束于;或\g。 你的 MySQL 连接 id 为 2 服务器版本:5.7.8-rc MySQL 社区服务器 (GPL)

版权所有 (c) 2000, 2015,Oracle 及其附属公司。 保留所有权利。

Oracle 是 Oracle Corporation 和/或其附属公司的注册商标。 其他名称可能是其各自所有者的商标。

键入 'help;' 或 '\h' 以获取帮助。 键入'\c'以清除当前输入语句。

  1. mysql> use mysql;

读取表信息以完成表和列名称 您可以关闭此功能以获得更快的启动 -A

数据库已更改

  1. mysql> update user set authentication_string=password('password') where user='root'; 查询 OK,4 行受影响,1个警告 (0.03 秒) 匹配的行:4 已更改:4 警告:1

  2. mysql> flush privileges; 查询 OK,0 行受影响 (0.00 秒)

  3. mysql> quit 再见

  4. sudo /etc/init.d/mysql stop

...180102 11:37:12 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended . * MySQL Community Server 5.7.8-rc 已停止 arif@ubuntu:~$ sudo /etc/init.d/mysql start .. * MySQL Community Server 5.7.8-rc 已启动

  1. mysql -u root -p

    输入密码:

    欢迎使用 MySQL 监视器。 命令结束于;或\g。 你的 MySQL 连接 id 为 2 服务器版本:5.7.8-rc MySQL 社区服务器 (GPL)

在 MySQL 5.7+ 版本中,表 mysql.user 的列 password 被替换为 authentication_string。

希望这些步骤能帮助任何人,谢谢。


19

我使用的是Ubuntu 18,并使用以下命令安装了MySQL(密码:root)。

sudo apt install mysql-server
sudo mysql_secure_installation
当我尝试使用普通的Ubuntu用户登录时,它会出现这个问题。
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

但是我能够通过超级用户登录到MySQL。使用以下命令,我能够通过普通用户登录。

sudo mysql    
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
exit;

那么您应该能够使用普通账户登录Mysql。

在这里输入图片描述


18

如果您在Workbench中遇到此错误,但能够从终端登录,请按照以下步骤操作。

首先使用当前密码登录:

sudo mysql -u root -p

那么请更改您的密码,因为使用强度较弱的密码有时会出现错误。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-strong-password';

FLUSH PRIVILEGES;

然后简单地退出并使用您的新密码再次登录:

quit

sudo mysql -u root -p

成功登录后,请键入以下命令:

use mysql;

它应该显示一个类似于“数据库已更改”的消息,然后输入:

UPDATE user SET plugin='mysql_native_password' WHERE User='root';

之后键入:

UPDATE mysql.user set authentication_string=PASSWORD('new-strong-password') where user='root';

然后输入:

FLUSH PRIVILEGES;

然后简单退出:
quit

现在尝试使用您的新密码在您的工作台登录。希望它能正常工作。谢谢。


8

1
使用 "locate mysql-server" 命令查找您的版本,然后相应地运行命令。 - Punnerud

6

在我的情况下,我在Mac OS Big Sur上进行新安装mysql后发现了这个错误。

我采取的解决方法是: 点击苹果图标,进入系统偏好设置,然后点击mysql。

在打开的设置窗口中有一个初始化数据库按钮,我点击它,然后再尝试访问,问题就解决了。


如果您通过 https://dev.mysql.com/downloads/mysql/ 进行安装,它会像一位冠军一样工作。 - PRITAM JANA
谢谢Sitti。我明白你的意思。很遗憾/令人困惑的是,你必须先与这个UI进行交互:( - Bryan_C

5
我在Ubuntu服务器上安装Testlink时遇到了这个问题,我按照以下步骤进行操作:
mysql -u root
use mysql;
update user set password=PASSWORD("root") where User='root';
flush privileges;
quit

现在停止实例并重新启动,即:
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接