错误 1698 (28000): 拒绝用户 'root'@'localhost' 的访问
Posted
技术标签:
【中文标题】错误 1698 (28000): 拒绝用户 \'root\'@\'localhost\' 的访问【英文标题】:ERROR 1698 (28000): Access denied for user 'root'@'localhost'错误 1698 (28000): 拒绝用户 'root'@'localhost' 的访问 【发布时间】:2017-01-09 22:22:17 【问题描述】:我正在设置一个新服务器并一直遇到这个问题。
当我尝试使用 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 应该具有访问权限。
服务器很简单,因为我已经尝试解决这个问题一段时间了。
它运行Ubuntu 16.04.1 LTS (Xenial Xerus) 与 Apache、MySQL 和 PHP,因此它可以托管网站,以及 iRedMail 0.9.5-1,因此它可以托管邮件。
在我安装 iRedMail 之前登录 MySQL 数据库可以正常工作。我也试过只安装 iRedMail,但 root 也不起作用。
如何解决我的 MySQL 登录问题,或者如何在现有 MySQL 安装上安装 iRedMail?是的,我尝试了Installation Tips,但在配置文件中找不到这些变量。
【问题讨论】:
我点击了这个链接,第一个选项对我有用:askubuntu.com/questions/763336/…sudo mysql_secure_installation
是解决这个问题的最简单方法
【参考方案1】:
你想用 root 用户访问 MySQL,但你没有提供 root 的正确密码。
如果您需要为 root 设置新密码,MySQL 的网站上有很好的文档说明如何操作:B.3.3.2 How to Reset the Root Password
我将不在此处显示该过程,因为 MySQL 在上述链接上的文档清晰简洁。
【讨论】:
感谢您的 anwser,但我无法让它工作,所以我选择使用 pgSQL 数据库安装 iRedMail。 罗杰福克曼!很高兴知道您以任何方式解决了您的问题。 链接中断。 mysql.com 多年来有许多断开的链接。您应该在此处复制并粘贴相关信息,只要注明出处即可。【参考方案2】:我建议删除 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 可能是因为您在再次安装时忽略了一些其他问题 @PJBrunet 可能是因为你的 Mysql 版本不同 很公平,但最好使用通用解决方案。【参考方案3】: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
插件。
有两种方法可以解决这个问题:
-
您可以设置root用户使用
mysql_native_password
插件
您可以使用system_user
创建一个新的db_user
(推荐)
选项 1:
sudo mysql -u root # I had to use "sudo" since it was 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 is 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 -u YOUR_SYSTEM_USER
) 连接到 MySQL。
注意:在某些系统上(例如,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_socket
为caching_sha2_password
。我没有使用 MySQL 8.x.x 的系统设置来测试这个。但是,上述步骤应该可以帮助您理解问题。回复如下:
MySQL 8.0.4 的一个变化是新的默认身份验证插件是“caching_sha2_password”。新的“YOUR_SYSTEM_USER”将具有此身份验证插件,您现在可以使用“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/
【讨论】:
选项 1 对我有用。但后来我还需要运行sudo gedit /etc/phpmyadmin/config.inc.php
。然后我搜索了AllowNoPassword
并取消了包含它的两行的注释。然后我就可以不用密码以root身份登录了。
选项 2 有效。我认为最好的做法是创建一个新用户并使用离开 root 在那里!
IDENTIFIED BY ''
位可能应该是 IDENTIFIED BY 'YOUR_PASSWD'
最后,确实有效的答案!!那里有无数答案说 do mysqld_safe --skip-grant-tables
等,但它没有工作。
好的,如果sudo mysql -u root -p
不让我进去怎么办?【参考方案4】:
我在 Windows 10 桌面上通过 PuTTY 与之交互的 Debian 8 (Jessie) 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's post 中概述的步骤操作,然后按照我的步骤操作。
现在您应该可以使用远程终端客户端并使用以下命令安全地登录 MySQL:
mysql -u your_user_name -p
*在提示时输入密码
【讨论】:
就这么简单。好吧,只有第一个命令不允许执行第二个,所以我会调整它编辑 - 请看看我是否正确......update user set plugin='' where user='your_user_name';
确实为我工作【参考方案5】:
第一步:转到文件/etc/phpmyadmin/config.inc.php,然后取消注释找到“AllowNoPassword”的行。
第二步:登录你的 MySQL 默认账户
mysql -u root -p
use mysql;
update user set plugin="" where user='root';
flush privilege;
仅此而已!
【讨论】:
【参考方案6】:一个新的版本的MySQL就是这样做的
在新的my-sql中,如果安装时密码为空,那么它基于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
完整详情请参考this link。
【讨论】:
这适用于我的开发服务器作为快速修复(Ubuntu 18.04 服务器),但是,我建议查看上述接受的答案,此外,不要在生产服务器上完全安装 PHPMyAdmin。 使用“sudo”时不需要“-p” 哇,这对我有用,mysql Ver 8.0.25-0ubuntu0.20.04.1,#nitipSendal 这很容易解决了我的问题!谢谢【参考方案7】:第 1 步。sudo mysql -u root -p
第 2 步。USE mysql;
第 3 步。ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin';
这里的“admin”是您的新密码,但您可以更改它。
第 4 步。exit
你已经完成了。
【讨论】:
【参考方案8】: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;
【讨论】:
【参考方案9】:这也发生在我身上。问题在于 Linux 发行版已经附带的 MySQL 存储库。因此,当您简单地这样做时:
sudo apt install mysql-server
它从他们的默认存储库安装 MySQL,这会产生这个问题。因此,要克服这个问题,您需要卸载已安装的 MySQL:
sudo apt remove mysql* --purge --auto-remove
然后从MySQL官方网站MySQL APT repository下载MySQL存储库。
按照他们的文档了解如何添加存储库和 安装它。这没有问题。
同样answered by zetacu,您可以验证 MySQL root 用户现在确实使用了 mysql_native_password 插件。
【讨论】:
【参考方案10】:操作系统:Ubuntu 18.04(仿生海狸)
MySQL:5.7
将skip-grant-tables
添加到文件mysqld.cnf
复制my.cnf文件
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
重设密码
(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
从 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
打开 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>
检查密码策略
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)!
更改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?
您应该已经决定重置密码以填写政策或更改政策。
【讨论】:
【参考方案11】:我第一次也遇到了同样的问题。
现在已经修复了:
首先,复制/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
最后输入你新创建的密码。
【讨论】:
工作得很好!但是您的答案需要更新! /etc/mysql/my.cnf 而不是 /etc/mysql/my.cng 和服务重启它的 sudo service mysql restart【参考方案12】:经过数小时的研究,我找到了我的解决方案。
停止 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
【讨论】:
【参考方案13】:就我而言,
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
重新启动服务器。
【讨论】:
【参考方案14】:不需要 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
【讨论】:
当我使用mysql -u $(whoami)
时,它也会给 ERROR 1045 (28000): Access denied for user 'kaw'@'localhost' (using password: NO)
设置密码'root'@'localhost' = password('YOUR_ROOT_PASSWORD_HERE');这节省了我的时间【参考方案15】:
经过几个小时在这里没有解决方案的斗争,这对我有用,然后我找到了一个 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以更好地理解
【讨论】:
【参考方案16】:关于如何为最新的 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。
【讨论】:
我输入 sudo mysql_secure_installation ,它要求我输入新的 mysql 密码(ubuntu 20.0 服务器版本) 这对我有用,谢谢。在 ubuntu 20.04 上【参考方案17】:我已完成以下步骤来解决此问题。 使用 (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;
如果您仍然收到错误,请尝试一次。希望这段代码对你有很大帮助!!
【讨论】:
【参考方案18】:第一个
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 |
+--------------------------------------+--------+
我们需要更改这些行
validate_password.length validate_password.number_count validate_password.policy 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”的数据库中;
【讨论】:
【参考方案19】:让我为你解决。
进入 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';
仅用于测试目的。
【讨论】:
【参考方案20】:对于在此处尝试解决方案但没有任何效果的任何人,请确保您使用的是正确的命令,sudo sudo mysql -u root -p
而不是 mysql mysql -u root -p
,您需要输入两个密码,一个是当前用户,一个是 root一个。
【讨论】:
【参考方案21】:这适用于我的 mysql Ver 8.0.26, ubuntu 20.04
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
【讨论】:
以上是关于错误 1698 (28000): 拒绝用户 'root'@'localhost' 的访问的主要内容,如果未能解决你的问题,请参考以下文章
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
ERROR 1698 (28000): Access denied for user ‘root‘@‘localhost‘解决方法
Ubuntu下连接mysql出现 ERROR 1698 (28000): Access denied for user 'root'@'localhost'错误解决方法