错误 1698 (28000):用户'root'@'localhost'被拒绝访问。

604

我正在搭建一个新服务器,但遇到了这个问题。

当我尝试使用root用户登录MySQL数据库时,会出现以下错误:

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

无论是通过终端(SSH)、phpMyAdmin还是MySQL客户端,比如Navicat,都无法连接成功。

我查看了mysql.user表并得到以下结果:

+------------------+-------------------+
| user             | host              |
+------------------+-------------------+
| root             | %                 |
| root             | 127.0.0.1         |
| amavisd          | localhost         |
| debian-sys-maint | localhost         |
| iredadmin        | localhost         |
| iredapd          | localhost         |
| mysql.sys        | localhost         |
| phpmyadmin       | localhost         |
| root             | localhost         |
| roundcube        | localhost         |
| vmail            | localhost         |
| vmailadmin       | localhost         |
| amavisd          | test4.folkmann.it |
| iredadmin        | test4.folkmann.it |
| iredapd          | test4.folkmann.it |
| roundcube        | test4.folkmann.it |
| vmail            | test4.folkmann.it |
| vmailadmin       | test4.folkmann.it |
+------------------+-------------------+

正如您所看到的,用户root应该有访问权限。

服务器相当简单,因为我已经尝试解决这个问题一段时间了。

它正在运行Ubuntu 16.04.1LTS(Xenial Xerus)与Apache、MySQL和PHP一起使用,以便它可以托管网站,以及iRedMail 0.9.5-1,以便它可以托管邮件。

在安装iRedMail之前,登录MySQL数据库没有问题。我还尝试仅安装iRedMail,但是root也无法工作。

我该如何解决我的MySQL登录问题或如何在现有的MySQL安装上安装iRedMail?是的,我尝试了安装提示,但我在配置文件中找不到那些变量。


4
我点击了这个链接,第一个选项对我有用:https://askubuntu.com/questions/763336/cannot-enter-phpmyadmin-as-root-mysql-5-7 - Mikael Arhelger
21
"sudo mysql_secure_installation" 是最简单的修复方法。 - Sergey Ponomarev
在2022年3月2日,这是“MySQL客户端ERROR 1698 28000用户访问被拒绝”的*头号搜索引擎结果。 - Peter Mortensen
23个回答

1666

在一些系统上,比如Ubuntu,MySQL 默认使用Unix auth_socket plugin

基本上这意味着:使用它的 db_users 会通过系统用户凭据进行“认证”。 您可以通过执行以下操作来查看您的root用户是否设置为这样:

sudo mysql -u root # I had to use "sudo" since it was a new installation

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------------------+
| User             | plugin                |
+------------------+-----------------------+
| root             | auth_socket           |
| mysql.sys        | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+

正如您在查询中所看到的,root 用户正在使用 auth_socket 插件。

有两种方法可以解决这个问题:

  1. 您可以将 root 用户设置为使用 mysql_native_password 插件
  2. 您可以创建一个新的 db_user 并使用您的 system_user(推荐)

选项 1:

sudo mysql -u root # I had to use "sudo" since it was a new installation

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

sudo service mysql restart

选项2:(用您拥有的用户名替换YOUR_SYSTEM_USER)

sudo mysql -u root # I had to use "sudo" since it was a new installation

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY 'YOUR_PASSWD';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;

sudo service mysql restart

请记住,如果您使用选项#2,则必须以您的系统用户名连接到MySQL(mysql -u YOUR_SYSTEM_USER)。

注意:在某些系统上(例如Debian 9(Stretch)),'auth_socket'插件被称为'unix_socket',因此相应的SQL命令应该是:UPDATE user SET plugin='unix_socket' WHERE User='YOUR_SYSTEM_USER';

根据andy的评论,MySQL 8.x.x更新/替换了auth_socketcaching_sha2_password。我没有使用MySQL 8.x.x设置系统来测试这一点。但是,上面的步骤应该可以帮助您理解问题。以下是回复:

MySQL 8.0.4的一个更改是新默认身份验证插件为“caching_sha2_password”。新的'YOUR_SYSTEM_USER'将具有此身份验证插件,现在可以从Bash shell登录并使用“mysql -u YOUR_SYSTEM_USER -p”提供此用户的密码。不需要“UPDATE user SET plugin”步骤。

有关8.0.4默认身份验证插件更新,请参见MySQL 8.0.4:新的默认身份验证插件:caching_sha2_password


9
选项1对我有用。但是我还需要运行sudo gedit /etc/phpmyadmin/config.inc.php。然后我搜索了一下AllowNoPassword,并取消注释包含它的两行。之后我就可以不需要密码以root身份登录了。 - Joe
11
选项2可行。我认为最佳实践是创建一个新用户并使用非root用户,让root保持原样! - PasinduJay
6
IDENTIFIED BY '' 可能应该改为 IDENTIFIED BY 'YOUR_PASSWD' - YakovL
6
终于有一个真正有效的答案了!! 有无数个答案说要做mysqld_safe --skip-grant-tables等操作,但都没有起作用。 - Stewart
6
如果 sudo mysql -u root -p 不能让我进入,该怎么办?请问您需要什么样的帮助? - Hrvoje T
显示剩余21条评论

356

MySQL的新版本采用了这种方式

在新的MySQL客户端中,如果在安装时密码留空,则基于auth_socket插件。

正确的方式是使用sudo权限登录MySQL。

sudo mysql -u root -p

然后使用以下方式更新密码:

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

完成此操作后,停止并重新启动 MySQL 服务器。

sudo service mysql stop
sudo service mysql start

完整信息请参考此链接


1
那个方法在我的开发服务器上起到了快速修复的作用(Ubuntu 18.04服务器),但是我建议您仍然查看上面被接受的答案,并且最好不要在生产服务器上安装PHPMyAdmin。 - Aaron Murray
3
使用“sudo”时,“-p”不是必需的。 - Aliaksandr Adzinets
4
哇,这对我有用,MySQL版本为8.0.25-0ubuntu0.20.04.1,#nitipSendal。 - Firman Hidayat
1
这很容易地解决了我的问题!谢谢。 - George Chalhoub
@AaronMurray 我目前没有这样做,但我很好奇,为什么PHPMyAdmin不适合生产环境?你会使用什么作为GUI的替代品?或者你是说生产服务器不应该有GUI吗? - Hashim Aziz
显示剩余4条评论

32

无需sudo

数据库初始化时有两个拥有全部权限的账户:第一个是"root",不可访问,第二个是您的用户名(使用命令whoami检查)。

要启用root账户的访问权限,需要使用您的用户名登录。

mysql -u $(whoami)

并手动更改root密码

use mysql;
set password for 'root'@'localhost' = password('YOUR_ROOT_PASSWORD_HERE');
flush privileges;
quit

以 'root' 身份登录

mysql -u root -p

1
当我使用 mysql -u $(whoami) 时,它也会显示 ERROR 1045 (28000): Access denied for user 'kaw'@'localhost' (using password: NO) - Kaumadie Kariyawasam
为 'root'@'localhost' 设置密码 = password('YOUR_ROOT_PASSWORD_HERE'); 这拯救了我的一天。 - Muhammed Shihabudeen Labba A
1
这看起来很有前途,但我认为根本不起作用(就像Kaumadie Kariyawasam提到的)。 这个系统是什么,包括操作系统,MySQL等版本,它是在什么状态下尝试的?例如权限,用户,组等方面的状态如何? - Peter Mortensen
我肯定需要使用 sudo。我必须先像这样打开mysql:sudo mysql,然后执行您的命令,现在密码已更改。 - Black

14
我在与PuTTY连接的Windows 10桌面上与Debian 8(Jessie)虚拟机交互时遇到了这个问题。
我尝试了这里的各种建议,但没有什么效果,我在Debian主机上运行MariaDB。最后,我发现我无法在安全模式下启动数据库服务器,但我并不需要,以下命令实际上对我有用,即允许新创建的MySQL用户登录MySQL/MariaDB服务器:
sudo service mysql restart
sudo mysql # Logs in automatically into MariaDB
use mysql;
update user set plugin='' where user='your_user_name';
flush privileges;
exit;
sudo service mysql restart # Restarts the MySQL service

如果上述方法不适用于您,请按照zetacu的帖子中概述的步骤进行操作,然后按照我的步骤进行操作。
现在,您应该能够使用远程终端客户端,并使用以下命令安全地登录到MySQL:
mysql -u your_user_name -p

提示输入密码时,请输入密码。


很简单。只有第一个命令不允许执行第二个命令,所以我将进行编辑调整 - 请看我是否正确... - kokbira
1
update user set plugin='' where user='your_user_name'; 对我起作用了。 - Muhammad Adnan

13

步骤 1. sudo mysql -u root -p

步骤 2. USE mysql;

步骤 3. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin';

这里的 'admin' 是新密码,但您可以更改它。

步骤 4. exit

完成。


9

在经过长时间的挣扎没有找到解决方案后,我发现了一个YouTube视频,视频中提到密码列现在被称为authentication_string

这让我能够按照以下步骤更改密码:

首先从终端进入MySQL客户端:

sudo mysql

然后在mysql内部,键入mysql>之后的任何内容:

mysql> use mysql
mysql> update user set authentication_string=PASSWORD("mypass") where user='root';
mysql> flush privileges;
mysql> quit;

此时您已经退出MySQL客户端,回到了正常的终端位置。您需要重新启动MySQL客户端才能使更改生效。为此,请键入以下内容:

sudo service mysql restart

请参考此视频链接以更好地理解。


我使用了你的第二个命令,结果出现了以下错误: ERROR 1064 (42000): 在你的SQL语法中有一个错误;请检查与你的MySQL服务器版本相对应的手册,以获取正确的语法使用方法,错误出现在 '("jovialp") where user='root'' 这一行 - undefined

9

有一份很好且定期更新的指南,教你如何为最新版本的MySQL设置新密码:

在Ubuntu 20.04上安装MySQL

建议从上述页面阅读整个主题,但简言之,以下内容或许有所帮助。

运行安全脚本:

sudo mysql_secure_installation

详细信息请参考 mysql_secure_installation

之后,您可以按照以下步骤更改密码:

sudo mysql

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

有关更改根用户密码的详细信息

如果您遇到问题,也许需要重新安装MySQL。


1
我输入sudo mysql_secure_installation,它要求我为mysql(Ubuntu 20.0服务器版本)输入新密码。 - Kuhan
这对我有用,谢谢。在Ubuntu 20.04上。 - tree em

8
我建议删除MySQL连接 -
这适用于MySQL 5.5版本。如果您的版本不同,请相应更改第一行。
sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.5 mysql-client-core-5.5
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt-get autoremove
sudo apt-get autoclean

重新安装,但这次设置一个自己的 root 密码。这将节省很多精力。

sudo apt-get update
sudo apt-get install mysql-server

@ingernet 可能是因为您在重新安装时忽略了其他问题。 - Eminem347
@PJBrunet 可能是因为你的 Mysql 版本不同。 - Eminem347
好的,但是一个通用的解决方案是最好的。 - PJ Brunet
“删除 MySQL 连接”是什么意思?是删除安装和配置文件吗? - Peter Mortensen

6
我第一次也遇到了同样的问题。
现在已经解决了:
首先,您需要复制/etc/mysql/mysql.conf.d/mysqld.cnf文件并粘贴到/etc/mysql/my.cnf中。
您可以通过以下命令来完成此操作:
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf

现在让我们重置密码:

在您的终端中使用以下命令:

sudo service mysql stop
sudo service mysql start
sudo mysql -u root

您现在位于MySQL控制台中。

接下来,让我们编写一些查询语句来重置我们的root密码:

USE mysql
update mysql.user set authentication_string=password('newpass') where user='root' and Host ='localhost';
update user set plugin="mysql_native_password";
flush privileges;
quit

现在我们可以清理 /etc/mysql/my.cng 文件。

在编辑器中打开上述文件并删除其中的整行内容。

之后,让我们重新启动MySQL:

sudo mysql service restart

现在使用新创建的密码来使用MySQL:
sudo mysql -u root -p

最后输入您新创建的密码。


2
工作得很好!但是你的答案需要更新!!文件路径应该是 /etc/mysql/my.cnf 而不是 /etc/mysql/my.cng ,重启服务的命令是 sudo service mysql restart。 - essayoub

6

经过数小时的研究,我找到了解决方案。

停止 MySQL

sudo service mysql stop

创建MySQL服务目录。
sudo mkdir /var/run/mysqld

给MySQL用户写入服务目录的权限。
sudo chown mysql: /var/run/mysqld

手动启动MySQL,不进行权限检查或网络连接。
sudo mysqld_safe --skip-grant-tables --skip-networking &

无需密码登录。

mysql -uroot mysql

更新密码

UPDATE mysql.user SET authentication_string=PASSWORD('YOURNEWPASSWORD'), plugin='mysql_native_password' WHERE User='root' AND Host='%';
EXIT;

关闭 MySQL。

sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown

正常启动MySQL服务。

sudo service mysql start

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