MySQL 错误:'Access denied for user 'root'@'localhost'。

544

考虑:

./mysqladmin -u root -p** '_redacted_'  

输出(包括输入密码):

输入密码:

mysqladmin:连接到本地主机的服务器失败,错误信息为:
'Access denied for user 'root'@'localhost' (using password: YES)'

我该如何修复这个问题?


5
可能是 [Access denied for user 'root'@'localhost' (using password: YES) (Mysql::Error)] 的重复问题。 - clearlight
1
@clearlight,这不是同一个问题。这篇文章是关于mysqladmin win超级权限进入mysql的问题,而另一篇文章是有关套接字简单连接的问题。 - e-info128
1
尝试删除如果存在的 ~/.my.cnf 文件。 - e-info128
44
虽然这篇文章有些年头了,但我想为将来的读者提供一个提示。不要在命令本身中输入MySQL密码,特别是root密码,否则它将被存储在 shell历史中。只需单独使用-p选项,MySQL会提示您输入密码。 - Scotty C.
1
对于MySQL 8,请使用sudo mysql_secure_installation并设置强密码。参考:请查看此教程的第5步 https://phoenixnap.com/kb/how-to-install-mysql-on-ubuntu-18-04 - Jhon Didier Sotto
29个回答

1047

我发现所有的解决方案都比必要的复杂,而且都对我无效。以下是解决我的问题的方法。不需要重启 mysqld 或以特殊权限启动。

sudo mysql

-- for MySQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

-- for MariaDB
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('root');

通过一个查询,我们将auth_plugin更改为mysql_native_password,并设置root密码为root(可以在查询中随意更改)

现在您应该可以使用root登录。更多信息可以在MySQL文档MariaDB文档中找到。

(使用Ctrl+D或输入exit退出MySQL控制台。)


70
我无法做到这一点... "您的SQL语法存在错误,请查阅相应版本Mariadb服务器对应的手册,以获取正确的语法使用方法,附近为:"。 - TCB13
5
这个回答很好,我不小心误点了“无用回答”投票选项,对不起! - taher
4
使用sudo命令执行以下MySQL语句: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root',其中将'root'用户在本地主机上的身份验证方式更改为使用mysql_native_password并设置密码为'root'。 - svet
37
在Ubuntu 18.04上表现非常良好。 - Almino Melo
12
这使我被锁出,即使使用sudo mysql也不再起作用。必须完全删除mysql并重新安装。 - jjxtra
显示剩余20条评论

650
  1. 根据你的发行版,打开并编辑 /etc/my.cnf/etc/mysql/my.cnf
  2. [mysqld]下面添加 skip-grant-tables
  3. 重新启动 MySQL。
  4. 现在你应该能够使用以下命令登录到 MySQL: mysql -u root -p
  5. 运行 mysql> flush privileges;
  6. 通过 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'; 设置新密码。
  7. 回到 /etc/my.cnf,移除/注释掉 skip-grant-tables。
  8. 重新启动 MySQL。
  9. 现在你可以使用新密码登录了 mysql -u root -p

6
你好, 我也遇到了同样的问题。 我按照上述方法解决了问题,但每次重启CentOS后,我需要重新执行所有步骤(我会收到消息:Access denied for user 'root'@'localhost' (using password: NO),当我运行mysql命令(或任何sql命令)时,我需要重复上述所有步骤。 - Eitan
26
很遗憾,这无法在MariaDB中使用:“您的SQL语法存在错误;请检查与您的MariaDB服务器版本对应的手册,以获取正确的语法使用方式,在第1行附近出现了'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword''”。 - Philipp Ludwig
14
我发现这段代码可以用于修改MariaDB中'root'用户的密码:set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');。我在第5步之后执行了此操作。以下是我的命令提示符输出内容:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec) - therobyouknow
6
第三步,重新启动MariaDB:我发现以下命令可以起作用:sudo systemctl restart mariadb - therobyouknow
7
可能有些人会在 /etc/mysql/my.cnf 中找到该文件。 - DSinghvi
显示剩余25条评论

136

之前的回答都没能解决我的问题,所以这里是我找到的解决方案

相关部分:

在运行MySQL 5.7(及更高版本)的Ubuntu系统中,默认情况下,root MySQL用户的身份验证插件设置为使用auth_socket插件而不是密码进行身份验证。这在许多情况下可以提供更好的安全性和可用性,但当您需要允许外部程序(例如phpMyAdmin)访问该用户时,它也可能会使事情变得复杂。

为了使用密码连接到MySQL作为root,您需要将其身份验证方法从auth_socket切换到mysql_native_password。要做到这一点,请从终端打开MySQL提示符:

sudo mysql

接下来,使用以下命令检查每个MySQL用户帐户使用哪种身份验证方法:

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 | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
在这个例子中,你可以看到 root 用户确实使用 auth_socket 插件进行认证。要将 root 账户配置为使用密码进行认证,请运行以下 ALTER USER 命令。确保将 password 更改为您选择的强密码,并注意此命令将更改您在第2步设置的 root 密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

然后,运行 FLUSH PRIVILEGES 命令,告诉服务器重新加载授权表并使新更改生效:

FLUSH PRIVILEGES;

再次检查每个用户使用的身份验证方法,以确认 root 不再使用 auth_socket 插件进行认证:

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

输出结果:
+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
你可以在这个例子的输出中看到,根MySQL用户现在需要使用密码进行身份验证。一旦你在自己的服务器上确认了这一点,就可以退出MySQL shell:
``` exit ```

1
Worx也适用于mysql Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))ubuntu 20.04上。干杯! - Jadeye
1
在Debian 10中,插件不是auth_socket而是unix_socket - Timo
你能修复格式问题吗(也包括第一版)? - Peter Mortensen
2
我收到了这个错误,为什么? You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BY 'MYPERSONALPASSWORD'' at line 1. 我刚刚粘贴了这一行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MYPERSONALPASSWORD'; - Fernando Torres
@FernandoTorres 我刚刚测试了那行代码,它按预期工作。你可以尝试复制/粘贴该行代码,手动输入它,或者切换到一个新的终端实例。 - sonrad10
显示剩余2条评论

90

我尝试了很多步骤来解决这个问题。有很多可能解决此问题的方法,很难从中筛选出有用的。最终,我在这里找到了一个好的解决方案:

步骤1:确定数据库版本

mysql --version

你将在MySQL中看到类似于以下输出:

mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

或者像这样输出 MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

请记录您正在运行的数据库及其版本,因为您稍后将使用它们。接下来,您需要停止数据库以便手动访问。

步骤2:停止数据库服务器

要更改 root 密码,您必须先关闭数据库服务器。

您可以通过以下方式停止 MySQL:

sudo systemctl stop mysql

对于MariaDB,使用以下命令:

sudo systemctl stop mariadb

步骤 3:跳过权限检查重启数据库服务器

如果您在未加载有关用户权限的信息的情况下运行 MySQL 和 MariaDB,则允许您以 root 权限访问数据库命令行而无需提供密码。这将使您能够在不知道密码的情况下访问数据库。

为了做到这一点,您需要停止数据库加载存储用户权限信息的授权表。由于这是一种安全风险,您还应该跳过网络连接以防止其他客户端连接。

启动数据库时不要加载授权表或启用网络:

sudo mysqld_safe --skip-grant-tables --skip-networking &

在该命令的末尾加上&符号,可以使该进程在后台运行,这样您就可以继续使用终端。

现在您可以以root用户身份连接到数据库,这不应要求输入密码。

mysql -u root

您将立即看到一个数据库shell提示符。

MySQL提示符

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

mysql>

MariaDB提示符

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

MariaDB [(none)]>

现在你已经拥有了root权限,你可以更改root密码。

步骤4:更改root密码

mysql> FLUSH PRIVILEGES;

现在,我们实际上可以更改根密码。

对于MySQL 5.7.6及以上版本以及MariaDB 10.1.20及以上版本,请使用以下命令:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

对于MySQL 5.7.5及更早版本以及MariaDB 10.1.20及更早版本,请使用:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

请确保用您选择的新密码替换new_password

注意:如果ALTER USER命令无法工作,则通常表示存在更大的问题。但是,您可以尝试使用UPDATE ... SET来重置root密码。

[重要]这是特别解决我的问题的那行代码:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

记得在此之后重新加载授权表。

无论哪种情况,您都应该看到命令已成功执行的确认信息。

Query OK, 0 rows affected (0.00 sec)

密码已更改,所以您现在可以停止手动实例的数据库服务器,并将其重新启动为之前的状态。

第5步:正常重启数据库服务器

本教程介绍了一些进一步操作以重新启动数据库,但我只使用了以下内容:

对于MySQL,请使用:

sudo systemctl start mysql

对于MariaDB,请使用:

sudo systemctl start mariadb

现在你可以通过运行以下命令来确认新密码已正确应用:

mysql -u root -p

现在该命令应提示输入新分配的密码。输入密码,您应该按预期获得对数据库提示符的访问权限。

结论

您现在已恢复对MySQL或MariaDB服务器的管理访问权限。确保您选择的新根密码强大且安全,并将其保存在安全的地方。


1
ALTER USER语句在MariaDB 10.2.0中被引入。 - Benoit Desrosiers
3
哇!这一行代码 mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost'; 对我来说真是救命稻草! - lucyjosef
我使用的是MariaDB 10.3.25,以下命令可行:mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password'); - Timo
我喜欢这种方法,因为它允许我临时创建数据库备份,而不必永久性地更改权限,尽管最好不要在后台运行mysqld_safe,因为之后似乎会遇到问题,试图杀死它,然后再次正常运行mysql服务(尽管完全重启Linux似乎可以解决问题)。 - SharpC
-bash: mysqld_safe: command not found AlmaLinux release 8.5 - Salem

60

3
这个插件非常有帮助。我尝试了很多组合,但只有这个适用于版本为14.14 Distrib 5.7.27的Linux(x86_64)。 - Alexey Nikonov
4
这对我在mysql 5.7上也很有帮助。因此不仅适用于mariadb。 - podarok
这对我在SQL 8和Ubuntu 20.04上有所帮助。 - Supun Madhushanka
那个插件应该做什么?你能提供官方文档的链接吗?请通过编辑(更改)您的答案来回复,而不是在评论中回复(不要包含“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen
这让我被锁在外面,我再也无法使用root登录了。它一直抛出Access denied for user 'root'@'localhost' (using password: YES)。由于我能够使用其他用户登录,所以我运行了SELECT user,password_last_changed FROM mysql.user;,它显示密码没有更新。那么为什么我还是无法登录?这很奇怪。 - nkhl
显示剩余2条评论

40

对于Ubuntu/Debian用户

(这可能适用于其他发行版,特别是基于Debian的发行版。)

运行以下命令作为root(无需任何密码)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

如果您不想每次连接时都添加--defaults-file来作为root,则可以将/etc/mysql/debian.cnf复制到您的家目录中:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

然后:

sudo mysql

3
只需要这样。显然,在Ubuntu上,“root”默认情况下不是“root”。 - Chaim Eliyah

37

根据我的经验,如果您不使用sudo运行,它将无法正常工作。因此,请确保您的命令为:

sudo mysql -uroot -p

5
这应该是被接受的答案。问题不在于忘记密码,而在于错误提示信息,因为你无法在没有sudo权限的情况下以root身份登录。 - nivs1978
3
所有的最佳答案都很差。为了节省时间,请使用此答案 - https://dev59.com/3FgR5IYBdhLWcg3wLau8#58155034 - parsecer
1
这应该是最佳答案。给你点赞。谢谢。 - Wahib Mkadmi
Waterreedshimmer Dracchingan的回答中有更多详细信息。 - Peter Mortensen

20

对于新Linux用户来说,这可能是一项艰巨的任务。让我使用MySQL 8更新一下(截至2018-09-12,最新版本为8.0.12)

  1. 打开“/etc/mysql/mysql.conf.d/”目录下的“mysqld.cnf”配置文件。
  2. 在[mysql]文本的下一行添加skip-grant-tables并保存。
  3. 以“sudo service mysql restart”重新启动MySQL服务。现在你的MySQL没有任何身份验证。
  4. 作为mysql -u root -p连接到MySQL客户端(也称为mysql-shell)。现在暂时没有密码需要输入。
  5. 运行SQL命令flush privileges;
  6. 现在重置密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPassword';
  7. 现在让我们回到正常状态;从“mysqld.cnf”中删除那一行“skip-grant-tables”,并重新启动服务。

就是这样。


mysql -u root -p still ask for password ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) - Salem
@Salem 尝试使用sudo,应该可以解决。 - Amit Kumar
当我运行这些步骤时,在第6步出现了错误:“ERROR 1290 (HY000):MySQL服务器正在使用--skip-grant-tables选项运行,因此无法执行此语句”。 - madacoda

14

在我的Debian 10系统中,出现了错误

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

被(好方法)解决了

sudo mysql -u root -p mysql

不好的方式:

mysql -u root -p mysql

1
这解决了问题。只需使用sudo(无需密码)授予权限,然后执行: sudo mysql -u root -p - Ali Obeid

11

我的工作站信息如下:

  • 操作系统:Ubuntu 21.04

  • PHP 版本:5.6.40-57

  • MYSQL 版本:5.7.37

让我们对其进行配置。

nano /etc/mysql/mysql.conf.d/mysqld.cnf

在底部,写下以下内容

skip-grant-tables

重新加载它。
service mysql restart

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