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


382

我正在设置新服务器,并继续遇到此问题。

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

错误1698(28000):用户'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应该具有访问权限。

该服务器非常简单,因为我已经尝试解决了一段时间。

它使用Apache,MySQL和PHP运行Ubuntu 16.04.1 LTS,因此可以托管网站,而iRedMail 0.9.5-1则可以托管邮件。

在安装iRedMail之前,登录MySQL数据库工作正常。我也尝试过,只是安装了iRedMail,但是然后以root身份也不起作用...

如果有人可以告诉我如何解决MySQL登录问题或如何安装iRedMail,请在现有的MySQL安装之上。是的,我尝试了安装技巧,但在配置文件中找不到那些变量。


我跟着这个链接,并为我工作的第一个选项:askubuntu.com/questions/763336/...
的Mikael Arhelger

3
sudo mysql_secure_installation是解决此问题的最简单方法
谢尔盖·波诺马列夫

Answers:


1119

某些系统,例如Ubuntu,mysql,默认情况下使用UNIX auth_socket插件

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

$ sudo mysql -u root # I had to use "sudo" since is 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 is new installation

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

$ service mysql restart

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

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
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;

$ service mysql restart

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

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

更新: 从@andy的评论看来,mysql 8.xx已更新/替换了,auth_socket因为caching_sha2_password我没有使用mysql 8.xx进行系统安装来测试此,但是上述步骤应该可以帮助您了解问题。这是答复:

自MySQL 8.0.4起,一项更改是新的默认身份验证插件为'caching_sha2_password'。新的“ YOUR_SYSTEM_USER”将具有此auth插件,您现在可以使用“ mysql -u YOUR_SYSTEM_USER -p”从bash shell登录,并在提示符下提供该用户的密码。无需“更新用户SET插件”步骤。有关8.0.4默认身份验证插件更新,请参见https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/


5
选项1对我有用。但是后来我也需要跑步sudo gedit /etc/phpmyadmin/config.inc.php。然后,我进行了搜索,AllowNoPassword并取消了包含它的两行的注释。然后,我无需密码即可以root用户身份登录。

7
选项2起作用。我认为,创建新用户并使用root身份始终是最佳做法!
PasinduJay

2
IDENTIFIED BY ''位可能应该是IDENTIFIED BY 'YOUR_PASSWD'
YakovL

4
最后,一个实际可行的答案!那里有不计其数的回答说“做” mysqld_safe --skip-grant-tables等等,但没有奏效。
斯图尔特

4
好吧,如果sudo mysql -u root -p不让我进去怎么办?
Hrvoje T '18年

173

在这里检查:

MYSQL的新版本就是这样做的。

在新的MySQL中如果安装时密码为空,则该密码基于auth_socket插件。

正确的方法是使用sudo特权登录到my-sql 。

$ sudo mysql -u root -p

然后使用以下命令更新密码:

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

一旦完成stop and start,mysql服务器。

$  sudo service mysql stop
$  sudo service mysql start

有关完整的详细信息,请参阅 此链接

如有任何疑问,请发表评论。


4
这对我使用Ubuntu 18很有用。非常感谢。
Peter Drinnan '18

10
在ubuntu 18.04上也工作良好
sgtkuncoro

2
正是我想要的。谢谢:)在Ubuntu 18上工作
Manthan_Admane '19

2
这就像一种魅力,lubuntu 19.04
Kvvaradha '19

3
这很好。该链接很有用。
kjohri

9

我在通过Windows 10桌面上的Putty与之交互的Debian 8 VM上遇到了此问题。

我在这里尝试了各种建议,但没有任何效果,并且我在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的帖子(zetacu)中概述的步骤进行操作,然后按照我的步骤进行操作。

现在,您应该能够使用远程终端客户端,并使用以下命令安全地登录mysql了:

mysql -u your_user_name -p

*提示时输入密码


这么简单。好吧,只有第一个命令不允许执行第二个命令,因此我将对其进行调整以进行编辑-请查看我是否正确...
kokbira

7

我建议删除Mysql连接-

UPDATE-这是针对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'9

足够公平,但是万能的解决方案是最好的。
PJ Brunet

6

经过数小时的努力,这里没有解决方案,这对我有用,然后我找到了一个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

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


5

步骤1。 sudo mysql -u root -p

第2步。 USE mysql;

第三步 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin';

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

第四步。 exit

谢谢。大功告成


5

不需要须藤

该数据库用2个全特权帐户初始化:第一个是无法访问的“ root”,第二个使用您的用户名(请使用command进行检查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

您是mysql实际版本的正确答案,谢谢!
Hugo S

3

第一步:转到/etc/phpmyadmin/config.inc.php,然后取消注释行,在其中找到AllowNoPassword。第二步:登录到您的mysql默认帐户

mysql -u root -p
use mysql;
update user set plugin="" where user='root';
flush privilege;

就这样!


3

对我有用:

mysql --user=root mysql
CREATE USER 'some_user'@'%' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'some_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

3

我也第一次遇到相同的问题。

现在已修复:

首先,您将/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控制台中。

然后让我们写一些查询来重置我们的根密码

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

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


1
干得好!但是您的答案需要更新!/etc/mysql/my.cnf而不是/etc/mysql/my.cng并为服务重启其sudo服务mysql restart
essayoub

3

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

停止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

什么都没有,这给了我一个mysql提示!谢谢!
UserX

2

您想以root用户访问MySQL,但没有提供root的正确密码。

如果您需要为root设置一个新密码,MySQL的站点上有很多有关如何执行此操作的文档:http : //dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

不会在此处显示该过程,因为上述链接上的MySql文档清晰明了


感谢anwser,但我无法使它正常工作,所以我选择使用pgSQL数据库安装iRedMail。
Folkmann '16

罗杰·福克曼!很高兴知道您如何解决问题。
CristianGonçalves16年

链接断开。这些年来,mysql.com有许多断开的链接。您应该在此处复制并粘贴相关信息,只要您将来源归因即可。

1

os:Ubuntu18.04

的MySQL:5.7

  1. skip-grant-tablesmysqld.cnf 添加到文件末尾

  2. cp my.cnf

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
  1. 重设密码
(base)   ~ sudo service mysql stop 
(base)   ~ sudo service mysql start
(base)   ~ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, 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> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed, 3 warnings
mysql> update mysql.user set authentication_string=password('newpass') where user='root' and Host ='localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> update user set plugin="mysql_native_password"; 
Query OK, 0 rows affected (0.00 sec)
Rows matched: 4  Changed: 0  Warnings: 0

mysql>  flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
  1. skip-grant-tables从my.cnf中删除
(base)   ~ sudo emacs /etc/mysql/mysql.conf.d/mysqld.cnf 
(base)   ~ sudo emacs /etc/mysql/my.cnf                 
(base)   ~ sudo service mysql restart
  1. 打开mysql
(base)   ~ mysql -uroot -ppassword 
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, 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> 
  1. 检查密码政策
mysql> select @@validate_password_policy;
+----------------------------+
| @@validate_password_policy |
+----------------------------+
| MEDIUM                     |
+----------------------------+
1 row in set (0.00 sec)


mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
6 rows in set (0.08 sec)!
  1. 更改的配置 validate_password
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.05 sec)

mysql> set global validate_password_mixed_case_count=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_number_count=3;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_special_char_count=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=3;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_dictionary_file    |       |
| validate_password_length             | 3     |
| validate_password_mixed_case_count   | 0     |
| validate_password_number_count       | 3     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 0     |
+--------------------------------------+-------+
6 rows in set (0.00 sec)

注意 您应该知道您的错误是由什么引起的?validate_password_policy?

您应该决定重设密码以填写政策或更改政策。


0

这也发生在我身上。问题是Linux发行版随附的mysql仓库。因此,当您简单地执行以下操作时: $ sudo apt install mysql-server 它会从其默认存储库中安装mysql,从而导致此问题。因此,要克服这一点,您需要卸载已安装的mysql $ sudo apt remove mysql* --purge --auto-remove

然后从官方mysql网站MySQL APT Repo下载mysql repo。请 按照他们的文档说明如何添加和安装repo。这没有问题。另外@zetacu回答,您可以验证mysql root现在确实使用mysql_native_password插件


0

就我而言

dev@Dev-007:~$ mysql -u root -p
Enter password: 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

我确定我的密码是正确的,否则错误代码将是 ERROR 1045 (28000): Access denied for user

所以我用sudo重新登录,

dev@Dev-007:~$ sudo mysql -u root -p

这一次对我有用。看文档

然后更改root密码,

mysql> alter user 'root'@'%' identified with mysql_native_password by 'me123';
Query OK, 0 rows affected (0.14 sec)

mysql> 

然后使用重新启动服务器 sudo /etc/init.d/mysql restart

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.