ERROR 1698(28000):用户'root'@'localhost'拒绝访问

时间:2016-09-01 22:06:08

标签: mysql iredmail

所以...我正在设置一个新的服务器并继续遇到这个问题。

当我尝试使用root用户登录MySQL数据库时,我收到“ERROR 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安装之上。是的,我尝试了Installation Tips,我无法在配置文件中找到这些变量。

非常感谢任何帮助:)

19 个答案:

答案 0 :(得分:709)

某些系统如Ubuntu,mysql默认使用UNIX auth_socket plugin

基本上意味着: db_users使用它,将是" auth"通过系统用户凭据。 您可以通过执行以下操作来查看您的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(推荐)
  3. 创建新的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延伸)' 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的一个变化是新的默认身份验证插件是&#39; caching_sha2_password&#39;。新的&#39; YOUR_SYSTEM_USER&#39;将有这个auth插件,您现在可以使用&#34; mysql -u YOUR_SYSTEM_USER -p&#34;从bash shell登录并在提示符下提供此用户的密码。不需要&#34; UPDATE用户SET插件&#34;步。对于8.0.4默认的auth插件更新,请参阅https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/

答案 1 :(得分: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

请参阅this video link以获得更好的理解

答案 2 :(得分: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

答案 3 :(得分:7)

不需要sudo

数据库使用2个全特权帐户初始化:第一个是无法访问的“ 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

答案 4 :(得分:6)

我在我的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

*在提示时输入密码

答案 5 :(得分:3)

关于如何为最新的MySQL设置新密码,有一份良好且定期更新的指南。

https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04

最好从上面的链接中阅读整个主题,但总而言之,这可能会有所帮助,

运行安全脚本:

sudo mysql_secure_installation

Detailed Info for "mysql_secure_installation"

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

sudo mysql

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

Detailed Info for changin root user password

如果遇到问题,可能需要重新安装MySql。

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

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

不会在此处显示该过程,因为 MySql文档在上面的链接它清晰简洁

答案 8 :(得分:1)

步骤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 :(得分:1)

That为我工作:

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

答案 10 :(得分:1)

第一个

sudo mysql -u root -p

SHOW VARIABLES LIKE 'validate_password%';

我们会看到这样的:

+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| 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      |
+--------------------------------------+--------+

我们需要更改这些行

<块引用>
  1. validate_password.length
  2. validate_password.number_count
  3. validate_password.policy
  4. validate_password.special_char_count
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=4;
SET GLOBAL validate_password.number_count=0;
SET GLOBAL validate_password.special_char_count=0;

SHOW VARIABLES LIKE 'validate_password%';

//我们会看到

+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 4     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 0     |
| validate_password.policy             | LOW   |
| validate_password.special_char_count | 0     |
+--------------------------------------+-------+

现在退出 MySQL

exit;
sudo mysql -u root -p

现在您只能输入 4 个或更多字母的密码。

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

exit;

sudo mysql -u root -p

您的新密码在用户“root”的数据库中;

答案 11 :(得分:0)

对于尝试过这里的解决方案但没有任何效果的任何人,请确保您使用的是正确的命令,sudo sudo mysql -u root -p 而不是 mysql mysql -u root -p,您需要输入两个密码,即当前密码之一用户和根用户。

答案 12 :(得分:0)

我已执行以下步骤来解决此问题。 使用 (sudo mysql -p -u root) 登录到您机器中的 MySQL 并点击以下查询。

1. CREATE USER 'jack'@'localhost' IDENTIFIED WITH mysql_native_password BY '<<any password>>';

2. GRANT ALL PRIVILEGES ON *.* TO 'jack'@'localhost';

3. SELECT user,plugin,host FROM mysql.user WHERE user = 'root';
+------+-------------+-----------+
| user | plugin      | host      |

+------+-------------+-----------+

| root | auth_socket | localhost |

+------+-------------+-----------+

4. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<<any password>>';

5. FLUSH PRIVILEGES;

如果您仍然遇到错误,请尝试一次。我希望这段代码对你有很大帮助!!

答案 13 :(得分: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
这次它对我有用。参见docs

然后更改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

重新启动服务器

答案 14 :(得分:0)

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

现在已解决:

首先,您将/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

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

答案 15 :(得分:0)

os:Ubuntu18.04

mysql:5.7

  1. skip-grant-tables添加到mysqld.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. 从my.cnf中删除skip-grant-tables
(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?

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

答案 16 :(得分:0)

这也发生在我身上。问题是Linux发行版随附的mysql仓库。因此,当您简单地做: $ sudo apt install mysql-server 它从默认仓库中安装了mysql,这给了这个问题。因此,要克服这一点,您需要卸载已安装的mysql $ sudo apt remove mysql* --purge --auto-remove

然后从官方mysql网站MySQL APT Repo下载mysql repo 遵循他们的文档,了解如何添加和安装仓库。 这没有问题。 就像@zetacu回答的那样,您可以验证mysql root现在确实使用了mysql_native_password插件

答案 17 :(得分:0)

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

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

就是这样!

答案 18 :(得分:-1)

让我为你解决。

  • 进入 sql。
  • 输入以下内容。
SET GLOBAL validate_password.length = 4;
SET GLOBAL validate_password.mixed_case_count = 0;
SET GLOBAL validate_password.number_count = 0;
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.special_char_count = 0;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

仅用于测试目的。