用户 'root'@'localhost'被拒绝访问(使用密码:YES)(Mysql::Error)

43

我尝试在服务器上部署Web应用程序,但出现了MySQL数据库异常:

Access denied for user 'root'@'localhost' (using password: YES) (Mysql::Error)

我尝试使用mysql -u root -p命令行访问数据库,可以执行所有数据库操作。

这个错误是什么?

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:771)
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3649)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1176)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2558)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1485)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
    at java.sql.DriverManager.getConnection(DriverManager.java:620)
    at java.sql.DriverManager.getConnection(DriverManager.java:200)
    at com.mpigeon.DbConnection.DbConn(DbConnection.java:26)
    at com.mpigeon.CheckLoginHome.doGet(CheckLoginHome.java:39)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

1
假设您正在使用JDBC,您能提供完整的错误消息(SQLException.getMessage())和堆栈跟踪吗? - Daniel
1
连接字符串的密码错误,请尝试使用mysql -u root -h localhost -p命令。 - Ravi Parekh
@Daniel:我已经发布了错误信息,请看一下并帮我解决。 - Jeevan Dongre
可以在这里找到一个快速解决方案,即MySQL错误:'Access denied for user 'root'@'localhost'的答案。 - svet
请检查提供的密码是否没有空格。 - Aaban Tariq Murtaza
14个回答

24

您需要授予来自本地主机的root访问权限。请参考Ubuntu帮助页面。


我遇到了和这个问题一样的情况。但是我已经授权给我的用户,但仍然面临同样的问题:( - jjmartinez
6
您好!如果这发生在 Windows 7 64 位操作系统中,我该如何处理? - Erran Morad
29
请直接发布答案本身,而不是链接(可能会消失)。 - Chuck Le Butt

9
尝试使用root,例如...
mysql -uroot

登录后,您可以使用以下命令检查不同的用户和主机:

select user,host,password from mysql.user;

6

从我的答案(这里)开始,我认为这可能很有用:

我尝试了很多步骤来解决这个问题。有很多可能解决此问题的来源,很难过滤出有用的信息。最终我在这里找到了一个好的解决方案:

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

请记录下你正在运行的数据库以及其版本,稍后会用到。接下来,您需要停止数据库以便手动访问。

第二步:停止数据库服务器

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

对于MySQL,您可以执行以下操作:

$ sudo systemctl stop mysql

对于使用MariaDB的情况:

$ sudo systemctl stop mariadb

第三步:在不检查权限的情况下重新启动数据库服务器

如果您在未加载有关用户特权信息的情况下运行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服务器的管理员访问权限。确保您选择的新根密码强大且安全,并将其保存在安全的位置。

第五步对我来说失败了,原因是某个日志文件,需要将 /var/lib/mysql/aria_log_control 重命名为另一个名称。 - undefined

6

请检查您是否在密码中输入了空格。


2

在将MySQL服务器从5.1.73升级到5.5.45后,我遇到了相同的错误。

还有一种方法可以解决这个错误。

在我的情况下,我能够使用root密码连接到MySQL,但MySQL拒绝向任何用户授予权限。

  1. Connect to MySQL as root

    mysql -u root -p
    

    then enter your MySQL root password;

  2. Select database;

    use mysql;
    
  3. Most probably there is only one record for root in mysql.user table allowing to connect only from localhost (that was in my case) but by the default there should be two records for root, one for localhost and another one for 127.0.0.1;

  4. Create additional record for root user with Host='127.0.0.1' if it's not there;

        SET @s = CONCAT('INSERT INTO mysql.user SELECT ',
                REPLACE((SELECT GROUP_CONCAT(COLUMN_NAME) 
                         FROM INFORMATION_SCHEMA.COLUMNS
                         WHERE TABLE_NAME = 'user' AND TABLE_SCHEMA = 'mysql')
                ,"Host","'127.0.0.1'"),
                ' FROM mysql.user WHERE User="root"'); 
    
         PREPARE stmt FROM @s; 
         EXECUTE stmt;
    
  5. Additionally to that you can execute mysql_upgrade -u -p to see if everything is ok.


2

如果您在安装时没有设置密码,那么出现这个错误,此时mysql使用unix-socket插件。

但是,如果从设置中删除插件链接(mysql.user表),将会出现其他问题。这并不能解决问题,反而会创建另一个问题。要修复已删除的链接并设置密码("PWD"),请执行以下操作:

1)按上述方法以 --skip-grant-tables 运行。

如果不起作用,请在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 部分中添加 skip-grant-tables 字符串。然后执行 sudo service mysql restart。

2)运行 mysql -u root -p,然后更改密码("PWD"):

最初的回答:

update mysql.user 
    set authentication_string=PASSWORD("PWD"), plugin="mysql_native_password" 
    where User='root' and Host='localhost';    
flush privileges;

quit
then sudo service mysql restart. Check: mysql -u root -p.

在重启之前,请从mysqld.cnf文件中删除该字符串(如果您在那里设置了它)。@bl79是这个答案的作者,我只是转载了它,因为它确实有帮助!原始答案翻译成“最初的回答”。

非常感谢,非常感谢,非常感谢!经过数小时的研究,这是唯一有效的解决方案。 - user3217883
如果这个对你真的有用,你可以给这个答案投票 :) - Alexey Nikonov
这不是我的帖子。我只是在研究同样的问题时发现了你的答案。 - user3217883
1
因为提到了unix-socket,所以点赞。似乎99%的帖子都在讨论如何重置密码,而没有提到如果存在socket,则密码将无法工作。文档质量较差。 - user1708042
是“mysql_native_password”这一部分让我找到了解决方法。 - exts

1

我的应用程序使用Mura CMS,我遇到了这个问题。然而,解决方案是我的mysql本地服务器密码与配置文件中的密码不匹配。当我同步它们后,它就可以工作了。


0

更新 mysql 数据库中的 user 表。并在密码为空时设置一些密码,我之前使用 root 用户,所以为 root 用户设置了密码。

update mysql.user set password = PASSWORD('123456') where password = '';
flush privileges;

然后我又尝试了一下通过ATG CIM提供密码,这次正常工作。

After update

http://i.stack.imgur.com/3Lchp.png


1
请注意,您在此处显示的 WHERE 子句将重置所有没有密码的用户的密码,而不仅仅是根用户(例如 WHERE User = 'root')? - Alexis Wilke

0

更新mysql中mysql.user表中的空密码

use mysql;
select host,user,password from mysql.user;
update mysql.user set password = PASSWORD('123456') where password = '';
flush privileges;

1
请注意,您在此处显示的“WHERE”子句将重置所有没有密码的用户的密码。不仅是根用户(例如 WHERE User ='root'?) - Alexis Wilke
登录只是为了说这是唯一对我有效的解决方案! - Afshin Ghazi

0

我在谷歌上搜索了很多,但没有找到一个明确的答案来解决我的问题。我使用KeyPass生成了一个强密码,并且可以成功地在mysql workbench上连接,但无法从命令行连接。所以我把密码改成了一个简单的,然后就可以在命令行上连接了。我已经成功创建了一个强密码,可以从终端连接。所以我的建议是,先尝试使用一个简单的密码,然后再尝试各种方法。


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