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

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

我正在设置新服务器并运行解决这个问题。

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

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

通过phpMyAdmin or a MySQL client, e.g., Navicat通过终端(SSH)连接没关系。他们都失败了。

我查看了 mysql.user table 并得到以下内容:

+------------------+-------------------+
| 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.1 LTS (Xenial Xerus) 与 Apache,MySQL 和 PHP,因此它可以托管网站,以及 iRedMail 0.9.5-1 , 以便它可以托管邮件。

在我安装 iRedMail 之前登录 MySQL 数据库工作正常。我也试过只安装 iRedMail,但是 root 也不起作用。

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

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

如果您需要为 root 设置新密码,MySQL 的站点有关于如何操作的很好的文档:B.3.3.2 How to Reset the Root Password

不会在这里展示这个过程,因为MySQL关于上述link的文档清晰简洁。

我建议删除 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

在某些系统上,默认情况下 Ubuntu, MySQL is using the 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_usersystem_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)) the 'auth_socket' plugin is called 'unix_socket',所以对应的SQL命令应该是:UPDATE user SET plugin='unix_socket' WHERE User='YOUR_SYSTEM_USER';

看来 MySQL 8.x.x updated/replaced auth_socketcaching_sha2_password。我没有带有 MySQL 8.x.x 的系统设置来测试它。但是,上述步骤应该可以帮助您理解问题。回复如下:

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

对于 8.0.4 默认身份验证插件更新,请参阅 MySQL 8.0.4: New Default Authentication Plugin: caching_sha2_password.

我在 Windows 10 桌面上的 Debian 8 (Jessie) VM that I was interacting with through PuTTY 上遇到了这个问题。

我尝试了这里的各种建议,但没有任何效果,我在 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

如果以上方法对您来说不太适用,请按照 中列出的步骤操作,然后按照我的步骤操作。

现在您应该可以使用远程终端客户端并使用以下命令安全登录 MySQL:

mysql -u your_user_name -p

*出现提示时输入密码

第一步:转到文件 /etc/phpmyadmin/config.inc.php,然后取消注释找到 "AllowNoPassword"[= 的行19=].

第二步:登录您的MySQL默认帐户

mysql -u root -p

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

仅此而已!

new 版本的 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

完整的细节可以参考this link

第 1 步。sudo mysql -u root -p

第 2 步。USE mysql;

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

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

第 4 步。exit

大功告成。

This 为我工作:

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

我也遇到过这种情况。问题出在 Linux 发行版中已经附带的 MySQL 存储库。所以当你简单地做:

sudo apt install mysql-server

它从出现此问题的默认存储库安装 MySQL。因此,要克服这一点,您需要卸载已安装的 MySQL:

sudo apt remove mysql* --purge --auto-remove

然后从官方 MySQL 网站 MySQL APT repository 下载 MySQL 存储库。

按照他们的文档了解如何添加存储库和 安装它。这没有问题。

一样,您可以验证 MySQL root 用户现在确实使用了 mysql_native_password 插件。

OS:Ubuntu 18.04(仿生海狸)

MySQL: 5.7

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

  2. 复制my.cnf文件

    sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
    
  3. 重设密码

    (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
    
  4. 从 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
    
  5. 打开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>
    
  6. 检查密码策略

    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)!
    
  7. 更改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?

您应该已经决定重置您的密码以符合政策或更改政策。

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

现已修复:

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

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

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

停止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 -u root -p

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

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

所以我使用 sudo,

重新登录
sudo mysql -u root -p

这次对我有用。参见 the documentation

然后修改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重新启动服务器。

不需要sudo

数据库使用 2 个全权限帐户初始化:第一个是无法访问的 "root",第二个是您的用户名(使用命令 whoami 检查)。

要启用对根帐户的访问,您需要使用您的用户名登录

mysql -u $(whoami)

并手动更改 root 的密码

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

登录为'root'

mysql -u root -p

经过数小时的努力而没有任何解决方案,这对我有用。我找到 a 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以获得更好的理解。

关于如何为最新 MySQL:

设置新密码,有一个很好的且定期更新的指南

How To Install MySQL on Ubuntu 20.04

最好从上面的页面阅读整个主题,但简而言之,这可能会有所帮助。

运行 安全脚本:

sudo mysql_secure_installation

Detailed information for mysql_secure_installation

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

sudo mysql

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

Detailed information for changing the root user password

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

我已完成以下步骤来解决此问题。

使用 (sudo mysql -p -u root) 在您的计算机中登录 MySQL 并点击以下查询。

  1. 创建用户 'jack'@'localhost' 通过 '<>';

    识别 mysql_native_password
  2. . 上的所有权限授予 'jack'@'localhost';

  3. SELECT 用户、插件、主机来自 mysql.user WHERE 用户 = 'root';

    +------+-------------+-----------+
    | user | plugin      | host      |
    +------+-------------+-----------+
    | root | auth_socket | localhost |
    +------+-------------+-----------+
    
  4. 更改用户 'root'@'localhost' 通过'<>';

    识别 mysql_native_password
  5. 刷新权限;

如果还是报错请再试一次。希望这段代码对你有很大帮助!!

第一个

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

现在你可以写你的密码,四个或更多字母。

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

exit;

sudo mysql -u root -p

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

对于尝试此处解决方案但没有任何效果的任何人,请确保您使用的是正确的命令,sudo sudo mysql -u root -p 而不是 mysql mysql -u root -p.

您需要输入两个密码,一个是当前用户密码,另一个是根用户密码。

这适用于 MySQL 版本 8.0.26 和 Ubuntu 20.04(Focal Fossa)。

sudo mysql -u root

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

+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+

mysql> UPDATE user SET

plugin='caching_sha2_password' WHERE User='root';

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'you_mysql_password';
mysql> FLUSH PRIVILEGES;
mysql> exit;

sudo service mysql restart

对于在 macOS 上安装最新 MariaDB 并遵循 MariaDB 文档中的 this tutorial 的用户,运行:

sudo mariadb-secure-installation

而不仅仅是给出的 mariadb-secure-installation 命令。否则,没有运气,尽管错误提示:

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Enter current password for root (enter for none):
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Enter current password for root (enter for none):
Aborting!