考虑:
./mysqladmin -u root -p** '_redacted_'
输出(包括输入密码):
输入密码:
mysqladmin:连接到本地主机的服务器失败,错误信息为:
'Access denied for user 'root'@'localhost' (using password: YES)'
我该如何修复这个问题?
考虑:
./mysqladmin -u root -p** '_redacted_'
输出(包括输入密码):
输入密码:
mysqladmin:连接到本地主机的服务器失败,错误信息为:
'Access denied for user 'root'@'localhost' (using password: YES)'
我该如何修复这个问题?
我发现所有的解决方案都比必要的复杂,而且都对我无效。以下是解决我的问题的方法。不需要重启 mysqld 或以特殊权限启动。
sudo mysql
-- for MySQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
-- for MariaDB
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('root');
通过一个查询,我们将auth_plugin更改为mysql_native_password,并设置root密码为root(可以在查询中随意更改)。
现在您应该可以使用root登录。更多信息可以在MySQL文档或MariaDB文档中找到。
(使用Ctrl+D或输入exit退出MySQL控制台。)
/etc/my.cnf
或 /etc/mysql/my.cnf
。[mysqld]
下面添加 skip-grant-tables
。mysql -u root -p
mysql> flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
设置新密码。mysql -u root -p
set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');
。我在第5步之后执行了此操作。以下是我的命令提示符输出内容:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
。 - therobyouknowsudo systemctl restart mariadb
。 - therobyouknow之前的回答都没能解决我的问题,所以这里是我找到的解决方案。
相关部分:
在运行MySQL 5.7(及更高版本)的Ubuntu系统中,默认情况下,root MySQL用户的身份验证插件设置为使用auth_socket插件而不是密码进行身份验证。这在许多情况下可以提供更好的安全性和可用性,但当您需要允许外部程序(例如phpMyAdmin)访问该用户时,它也可能会使事情变得复杂。
为了使用密码连接到MySQL作为root,您需要将其身份验证方法从auth_socket切换到mysql_native_password。要做到这一点,请从终端打开MySQL提示符:
sudo mysql
接下来,使用以下命令检查每个MySQL用户帐户使用哪种身份验证方法:
SELECT user,authentication_string,plugin,host FROM mysql.user;
输出
在这个例子中,你可以看到 root 用户确实使用 auth_socket 插件进行认证。要将 root 账户配置为使用密码进行认证,请运行以下 ALTER USER 命令。确保将 password 更改为您选择的强密码,并注意此命令将更改您在第2步设置的 root 密码:+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)
然后,运行 FLUSH PRIVILEGES 命令,告诉服务器重新加载授权表并使新更改生效:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
再次检查每个用户使用的身份验证方法,以确认 root 不再使用 auth_socket 插件进行认证:
FLUSH PRIVILEGES;
输出结果:
SELECT user,authentication_string,plugin,host FROM mysql.user;
你可以在这个例子的输出中看到,根MySQL用户现在需要使用密码进行身份验证。一旦你在自己的服务器上确认了这一点,就可以退出MySQL shell:+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)
``` exit ```
mysql Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
在ubuntu 20.04
上。干杯! - Jadeyeauth_socket
而是unix_socket
。 - TimoYou have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BY 'MYPERSONALPASSWORD'' at line 1
. 我刚刚粘贴了这一行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MYPERSONALPASSWORD';
- Fernando Torres我尝试了很多步骤来解决这个问题。有很多可能解决此问题的方法,很难从中筛选出有用的。最终,我在这里找到了一个好的解决方案:
步骤1:确定数据库版本
mysql --version
你将在MySQL中看到类似于以下输出:
mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
或者像这样输出 MariaDB:
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
请记录您正在运行的数据库及其版本,因为您稍后将使用它们。接下来,您需要停止数据库以便手动访问。
步骤2:停止数据库服务器
要更改 root 密码,您必须先关闭数据库服务器。
您可以通过以下方式停止 MySQL:
sudo systemctl stop mysql
对于MariaDB,使用以下命令:
sudo systemctl stop mariadb
步骤 3:跳过权限检查重启数据库服务器
如果您在未加载有关用户权限的信息的情况下运行 MySQL 和 MariaDB,则允许您以 root 权限访问数据库命令行而无需提供密码。这将使您能够在不知道密码的情况下访问数据库。
为了做到这一点,您需要停止数据库加载存储用户权限信息的授权表。由于这是一种安全风险,您还应该跳过网络连接以防止其他客户端连接。
启动数据库时不要加载授权表或启用网络:
sudo mysqld_safe --skip-grant-tables --skip-networking &
在该命令的末尾加上&符号,可以使该进程在后台运行,这样您就可以继续使用终端。
现在您可以以root用户身份连接到数据库,这不应要求输入密码。
mysql -u root
您将立即看到一个数据库shell提示符。
MySQL提示符
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
MariaDB提示符
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
现在你已经拥有了root权限,你可以更改root密码。
步骤4:更改root密码
mysql> FLUSH PRIVILEGES;
现在,我们实际上可以更改根密码。
对于MySQL 5.7.6及以上版本以及MariaDB 10.1.20及以上版本,请使用以下命令:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
对于MySQL 5.7.5及更早版本以及MariaDB 10.1.20及更早版本,请使用:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
请确保用您选择的新密码替换new_password
。
注意:如果ALTER USER
命令无法工作,则通常表示存在更大的问题。但是,您可以尝试使用UPDATE ... SET
来重置root密码。
[重要]这是特别解决我的问题的那行代码:
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
记得在此之后重新加载授权表。
无论哪种情况,您都应该看到命令已成功执行的确认信息。
Query OK, 0 rows affected (0.00 sec)
密码已更改,所以您现在可以停止手动实例的数据库服务器,并将其重新启动为之前的状态。
第5步:正常重启数据库服务器
本教程介绍了一些进一步操作以重新启动数据库,但我只使用了以下内容:
对于MySQL,请使用:
sudo systemctl start mysql
对于MariaDB,请使用:
sudo systemctl start mariadb
现在你可以通过运行以下命令来确认新密码已正确应用:
mysql -u root -p
现在该命令应提示输入新分配的密码。输入密码,您应该按预期获得对数据库提示符的访问权限。
结论
您现在已恢复对MySQL或MariaDB服务器的管理访问权限。确保您选择的新根密码强大且安全,并将其保存在安全的地方。
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
对我来说真是救命稻草! - lucyjosefmysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
- Timomysqld_safe
,因为之后似乎会遇到问题,试图杀死它,然后再次正常运行mysql服务(尽管完全重启Linux似乎可以解决问题)。 - SharpC-bash: mysqld_safe: command not found
AlmaLinux release 8.5
- Salem在尝试了所有其他答案之后,最终对我有效的是:
sudo mysql -- It does not ask me for any password
-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;
我在博客文章中找到了答案:Solved: Error “Access denied for user ‘root’@’localhost’” of MySQL — codementor.tech (Medium)。
Access denied for user 'root'@'localhost' (using password: YES)
。由于我能够使用其他用户登录,所以我运行了SELECT user,password_last_changed FROM mysql.user;
,它显示密码没有更新。那么为什么我还是无法登录?这很奇怪。 - nkhl(这可能适用于其他发行版,特别是基于Debian的发行版。)
运行以下命令作为root
(无需任何密码)
sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf
如果您不想每次连接时都添加--defaults-file
来作为root
,则可以将/etc/mysql/debian.cnf
复制到您的家目录中:
sudo cp /etc/mysql/debian.cnf ~/.my.cnf
然后:
sudo mysql
根据我的经验,如果您不使用sudo运行,它将无法正常工作。因此,请确保您的命令为:
sudo mysql -uroot -p
对于新Linux用户来说,这可能是一项艰巨的任务。让我使用MySQL 8更新一下(截至2018-09-12,最新版本为8.0.12)
就是这样。
mysql -u root -p
still ask for password ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- Salem在我的Debian 10系统中,出现了错误
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
被(好方法)解决了
sudo mysql -u root -p mysql
不好的方式:
mysql -u root -p mysql
我的工作站信息如下:
操作系统:Ubuntu 21.04
PHP 版本:5.6.40-57
MYSQL 版本:5.7.37
让我们对其进行配置。
nano /etc/mysql/mysql.conf.d/mysqld.cnf
在底部,写下以下内容
skip-grant-tables
service mysql restart
~/.my.cnf
文件。 - e-info128-p
选项,MySQL会提示您输入密码。 - Scotty C.