MySQL错误::'拒绝访问用户'root'@'localhost'


262

$ ./mysqladmin -u root -p ' 编辑 '
输入密码:

mysqladmin:在“ localhost”处连接到服务器失败错误:
“对用户“ root” @“ localhost”的访问被拒绝(使用密码:是)

我怎样才能解决这个问题?



1
@clearlight不是同一个问题,这个帖子是mysqladmin将超级特权赢进mysql的问题,另一个帖子是从套接字进行简单连接的问题。
e-info128

如果存在~/.my.cnf文件,请尝试删除。
e-info128

11
我知道这很古老,但是想对以后的访客说。不要在命令本身中输入您的mysql密码,尤其是root密码,否则它将存储在您的shell历史记录中。只需单独保留该-p选项,mysql将提示输入密码。
Scotty C.

Answers:


356
  1. 打开并编辑/etc/my.cnf/etc/mysql/my.cnf,具体取决于您的发行版。
  2. 添加skip-grant-tables[mysqld]
  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时,我都需要再次执行所有步骤(我收到了消息:用户'root'@'localhost'的访问被拒绝(使用密码:NO)-当运行命令mysql(或任何sql命令)时,每次重新启动时,我一次又一次地如上操作
Eitan

19
太糟糕了,这不适用于MariaDB: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 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig

11
我发现它可以工作@PhilippLudwig 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)
外观

3
对于步骤3,重新启动MariaDB:我发现以下作品:sudo systemctl restart mariadb
therobyouknow

7
有些人可能会在
/etc/mysql/my.cnf中

588

我发现的所有解决方案都比必要的复杂得多,没有一个对我有用。这是解决我的问题的解决方案。无需重新启动mysqld或以特殊特权启动它。

sudo mysql

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

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

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

(使用Ctrl + D或通过键入exit退出mysql控制台)


41
我无法执行此操作...“您的SQL语法有误;请查看与您的MariaDB服务器版本相对应的手册,以获取在...附近使用的正确语法”。
TCB13

2
这个答案行得通,我不小心加了没用的答案投票,对不起!
taher

25
在Ubuntu 18.04上工作得很好
Almino Melo '18

2
@ TCB13和其他任何面临此问题的人。“我无法执行此操作……”您的SQL语法有误;请检查与您的MariaDB服务器版本相对应的手册,以获取在...附近使用的正确语法。“。在执行alter命令之前,请使用FLUSH PRIVILEGES
编码器

3
您保存了我的一天:)
xger86x

50

我尝试了许多步骤来纠正此问题。有许多解决此问题的方法的资源,很难从废话中滤除它的含义。我终于在这里找到了一个很好的解决方案:

步骤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

您将立即看到数据库外壳提示。

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:更改根密码

mysql> FLUSH PRIVILEGES;

现在,我们可以实际更改root密码了。

对于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
MariaDB 10.2.0中引入了ALTER USER语句。
Benoit Desrosiers

2
哇 !这条线mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';对我来说是如此的救命!
lucyjosef

35

上面的答案都没有帮助我解决这个问题,所以这是我找到的解决方案

相关部分:

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

为了使用密码以root用户身份连接到MySQL,您需要将其身份验证方法从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插件进行了身份验证。要将根帐户配置为使用密码进行身份验证,请运行以下ALTER USER命令。确保将密码更改为您选择的强密码,并注意此命令将更改您在步骤2中设置的根密码:

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


27

对于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

2
这就是全部。显然,默认情况下,“ root”在Ubuntu上不是“ root”。
Chaim Eliyah 18-10-21

21

在尝试了所有其他答案之后,这终于对我有用

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

我在这篇文章中找到了答案:https : //medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06


1
此插件行非常有用。我尝试了很多编译,但这是唯一适用于Ver 14.14 Distrib 5.7.27,适用于Linux(x86_64)的软件
AlexNikonov

2
这也对mysql 5.7有所帮助。因此不仅适用于mariadb
podarok,

我刚刚在MySQL 8 Ubuntu 20.04上使用了它,并且它起作用了。使用skip-grant-table(my.conf或in mysql命令)的其他答案无效。我可以使用服务帐户(askubuntu.com/a/120769/169836),但UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';无法正常工作。只有在使用插件部分时,事情才起作用。谢谢〜
hamx0r

16

对于新的Linux用户,这可能是一项艰巨的任务。让我用mysql 8更新它(当前可用的最新版本是2018年9月12日的8.0.12)

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

而已。


5

在您的MySQL工作台中,您可以转到左侧的侧栏,在“管理”下选择“用户和特权”,在“用户帐户”下单击“ root”,在右侧部分单击“帐户限制”选项卡以增加最大查询,更新等,以及然后单击“管理角色”标签,然后选中相应的框以授予帐户访问权限。希望有帮助!


4

我这样做是为了在OSx中的MySQL初始设置中设置我的根密码。打开一个终端。

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

关闭终端并打开一个新终端。在Linux中,以下人员可以设置root密码。

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables:第一次对我不起作用。但是第二次尝试,成功了。)

然后登录到MySQL

mysql -u root

FLUSH PRIVILEGES;

现在更改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

重新启动MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start

3

就我而言,在Debian 10下,错误

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

被(GOOD WAY)解决了

sudo mysql -u root -p mysql

坏道:

mysql -u root -p mysql

3

gh-对我没有任何帮助!我有一台运行mariadb 5.5.64的CentOS 7.4计算机。

我要做的就是在从yum安装mariadb之后进行的。

# systemctl restart mariadb
# mysql_secure_installation

mysql_secure_installation将带您通过一些步骤,包括“设置root的密码?[Y / N]”。只需说“ y”并输入密码即可。根据需要回答其他问题。

然后,您可以使用以下密码输入密码

# mysql -u root -p

它将生存

# systemctl restart mariadb

钥匙

然后,我检查了/bin/mysql_secure_installation源代码,以发现它神奇地能够更改root密码,并且这里没有其他答案。导入位是:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

...它说SET Password=...而不是SET authentication_string = PASSWORD...。因此,此版本(5.5.64)的正确过程为:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

在mysql>提示符下:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

杀死正在运行的mysqld_safe。重新启动mariadb。以root用户身份登录:mysql -u -p。使用您的新密码。

如果需要,可以一次设置所有root密码。我认为这是明智的:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

这将对所有根密码执行更新:即,“ localhost”,“ 127.0.0.1”和“ :: 1”

将来,当我使用RHEL8或您拥有的产品时,我会尽量记住检查/ bin / mysql_secure_installation并查看其工作方式,这些人是为此操作系统配置mariadb的。


2

如果您像我一样,但以上所有建议均失败,请继续卸载计算机上所有版本的mysql,使用此命令sudo find / -name "mysql"以及rm -rf所有带有mysql名称的文件或目录搜索所有剩余的mysql文件(您应跳过与之相关的文件编程语言库)。现在安装新版本的MySQL并享受。注意:您将丢失所有数据,因此请先权衡一下您的选择。


1

如果您没有足够的特权,可能会发生这种情况。类型su,输入root密码,然后再试一次。


1

好的,我知道这是一个旧线程,但是如果您像我一样通过Google访问此页面,但上述解决方案均无效,那么最终的错误就是我100%愚蠢。我没有连接到服务器。连接后,一切都顺利进行。

万一有助于了解我的设置,我正在使用Sequel Pro,并尝试使用NPM软件包mysql与Node连接。我认为我实际上不需要连接(除了运行Sequel Pro),因为我已经在我的应用程序中进行了连接。

在此处输入图片说明


0

解: 放弃!

告诉我一下,我花了整整两天的时间试图使MySQL无法正常工作,始终卡有权限错误,但该错误中的任何内容均未解决。到了这样的地步,我想如果我继续下去,我会发疯的。

出于耐心等待,我仅使用450KB就发送了安装SQLite的命令,并且从单词go开始就可以正常工作。

如果您没有圣徒的耐心,请使用SQLite并节省大量时间,精力,痛苦和存储空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.