MySQL错误:'root'@'localhost'

考虑:

./mysqladmin -u root -p** '_redacted_'

输出(包括输入密码):

输入密码:

mysqladmin: connect to server at 'localhost' failed error:
'用户'root'@'localhost'(使用密码:YES)拒绝访问'

我该如何解决这个问题?

1656935 次浏览
  1. 打开并编辑/etc/my.cnf/etc/mysql/my.cnf,这取决于你的发行版。
  2. [mysqld]下面添加skip-grant-tables
  3. 重新启动MySQL
  4. 现在你应该可以使用下面的命令mysql -u root -p登录MySQL
  5. 运行mysql> flush privileges;
  6. 设置新密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. 回到/etc/my.cnf和删除/评论 skip-grant-tables
  8. 重新启动MySQL
  9. 现在您可以使用新密码mysql -u root -p登录

在你的MySQL工作台中,你可以转到左边栏,在“管理”下选择“用户和特权”,在“用户帐户”下单击root,在右边部分单击“帐户限制”选项卡。以增加查询、更新等的最大次数,然后点击“管理角色”选项卡;然后勾选复选框,授予该帐户访问权限。

我这样做是为了在OS x中MySQL的初始设置中设置我的根密码。

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

关闭终端并打开一个新终端。

在Linux中,可以使用以下方法设置根密码。

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables:第一次对我没用。但在第二次尝试时,成功了。)

然后登录MySQL:

mysql -u root


FLUSH PRIVILEGES;

现在修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

重新启动MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start

我找到的所有解决方案都比必要的要复杂得多,没有一个适合我。这是解决我问题的办法。不需要重新启动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登录了。更多信息可以在MySQL文档MariaDB文档中找到。

(用退出MySQL控制台,Ctrl + D或输入 Exit )

对于Ubuntu/Debian用户

(它可能适用于其他发行版,尤其是基于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

我尝试了很多步骤来纠正这个问题。这个问题有很多可能的解决方案,很难从废话中筛选出有意义的东西。我终于找到了一个很好的解决方案。

步骤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而不加载用户权限信息,它将允许您使用根权限访问数据库命令行,而无需提供密码。这将允许您在不知情的情况下访问数据库。

为此,您需要停止数据库加载授权表,授权表存储用户特权信息。因为这有一点安全风险,所以您也应该跳过网络连接,以防止其他客户端连接。

启动数据库而不加载授权表或启用网络:

sudo mysqld_safe --skip-grant-tables --skip-networking &

此命令末尾的&号将使此进程在后台运行,以便您可以继续使用您的终端。

现在您可以作为根用户连接到数据库,不需要输入密码。

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)]>

现在您拥有了根访问权限,您可以更改根密码。

步骤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来重置根密码。

这是修复我的特定问题的特定行:

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服务器的管理访问。确保你选择的新根密码是强大和安全的,并把它放在安全的地方。

对于新Linux用户来说,这可能是一项艰巨的任务。让我用MySQL 8更新这个(目前可用的最新版本是8.0.12,截至2018-09-12)

  1. 打开“mysqld.cnf"配置文件在“/etc/mysql/mysql.conf.d/"”
  2. skip-grant-tables添加到[mysql]文本的下一行并保存。
  3. 重新启动MySQL服务为“sudo service MySQL Restart”。现在您的MySQL无需任何身份验证。
  4. Mysql -u root -p连接到MySQL客户端(也称为MySQL -shell)。目前还没有需要输入的密码。
  5. 执行SQL命令冲洗特权;
  6. 现在将密码重置为ALTER USER 'root'@'localhost'
  7. 现在让我们回到正常状态;删除那行“skip-grant-table”;从“mysqld.cnf"并重新启动服务。

就是这样。

在我的Debian 10的情况下,错误

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

由(的好方法)

sudo mysql -u root -p mysql

糟糕的方式:

mysql -u root -p mysql

在尝试了所有其他答案后,这是最后对我有用的:

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;

我在博客文章解决:MySQL - codementor.tech的错误" Access denied for user ' root ' @ ' localhost ' (Medium)中找到了答案。

如果你像我一样,在前面的答案中所有的信息都失败了,继续卸载在你的机器上的所有版本的MySQL,使用命令sudo find / -name "mysql"rm -rf搜索所有剩余的MySQL文件,每个文件或目录与“mysql"名称附加到它(您应该跳过与编程语言库相关的文件)。

现在安装一个新版本的MySQL,开始享受吧。注:你将失去所有的数据,所以先权衡你的选择。

如果你没有足够的特权,就会发生这种情况。

输入su,输入root密码,然后重试。

之前的答案都没有帮助我解决这个问题,所以这是我找到的解决办法

相关部分:

在运行MySQL 5.7(及后续版本)的Ubuntu系统中,root MySQL用户默认使用auth_socket插件进行认证,而不是使用密码。在许多情况下,这允许一些更高的安全性和可用性,但当您需要允许外部程序(例如phpMyAdmin)访问用户时,它也会使事情复杂化。

为了以root身份使用密码连接MySQL,需要将其身份验证方法从auth_socket切换到mysql_native_password。要做到这一点,从你的终端打开MySQL提示:

sudo mysql

接下来,使用以下命令检查每个MySQL用户帐户使用的身份验证方法:

SELECT user,authentication_string,plugin,host FROM mysql.user;

输出

+------------------+-------------------------------------------+-----------------------+-----------+
| 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)

在这个例子中,您可以看到根用户实际上使用auth_socket插件进行了身份验证。要将root帐户配置为使用密码进行身份验证,请运行以下ALTER USER命令。请确保将密码更改为您选择的强密码,并注意该命令将更改您在步骤2中设置的根密码:

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

然后,运行FLUSH PRIVILEGES,告诉服务器重新加载授权表,并使您的新更改生效:

FLUSH PRIVILEGES;

再次检查每个用户使用的身份验证方法,确认root不再使用auth_socket插件进行身份验证:

SELECT user,authentication_string,plugin,host FROM mysql.user;

输出

+------------------+-------------------------------------------+-----------------------+-----------+
| 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)

在这个示例输出中,您可以看到root MySQL用户现在使用密码进行身份验证。一旦你在自己的服务器上确认了这一点,你可以退出MySQL shell:

exit

如果你像我一样通过谷歌到达这个页面,以前的解决方案都不起作用,原来是错误的是我100%的愚蠢。一旦连接,一切都是一帆风顺的。

为了帮助了解我的设置,我正在使用Sequel Pro,并试图使用NPM包mysql与Node连接到它。我不认为我需要实际连接(除了运行Sequel Pro),因为我已经从我的应用程序中这样做了。

Enter image description here

啊,对我来说什么都没用!我有一个CentOS 7.4机器运行MariaDB 5.5.64。

我必须这样做,从百胜安装MariaDB之后;

systemctl restart mariadb
mysql_secure_installation

mysql_secure_installation将带您通过一些步骤,包括"设置根密码?[Y / n]“。只要说“y”;给它一个密码。随你怎么回答其他问题。

然后你可以用你的密码,使用

mysql -u root -p

它会存活下来

systemctl restart mariadb

的关键

然后,我检查了/bin/mysql_secure_installation源代码,以找出它是如何神奇地能够改变根密码,而这里没有其他答案可以。导入位是:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

...它说的是SET Password=...而不是SET authentication_string = PASSWORD...。因此,本版本(5.5.64)的正确步骤是:

使用mysql -u root -p登录,使用您已经设置的密码。

或者,停止数据库并启动它:

mysql_safe --skip-grant-tables --skip-networking &

mysql>提示符中:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

停止运行mysqld_safe。重启MariaDB。以root身份登录:mysql -u -p。请使用新密码。

如果您愿意,您可以一次设置所有的根密码。我认为这是明智的:

mysql -u root -p


(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

这将对所有根密码执行更新:即,对于“;localhost",”;127.0.0.1"和“;::1"

将来,当我去RHEL 8或你有什么,我会试着记得检查/bin/mysql_secure_installation,看看这些家伙是怎么做的,谁是为这个操作系统配置MariaDB的人。

解决方案:放弃!

听我说完。我花了整整两天的时间试图让MySQL工作,但没有任何效果,总是被权限错误卡住,没有一个是通过这个问题的答案解决的。我想,如果我继续下去,我会疯掉的。

由于没有耐心,我发送了安装SQLite的命令,只使用了450 KB,它从一开始就工作得很好。

如果你没有圣人的耐心,那就使用SQLite吧,这样可以为你节省大量的时间、精力、痛苦和存储空间。

我在设置mysql-8 zip版本时得到了相同的错误。最后,切换到无缝工作的installer版本。在安装过程中,会提示设置root密码。一旦设置好,它就一定能工作。

Enter image description here

根据我的经验,如果你没有sudo,它是行不通的。所以确保你的命令是;

sudo mysql -uroot -p

修复macOS

  1. https://downloads.mysql.com/archives/community/安装MySQL(8)。请确保与macOS版本兼容)

  2. 在安装过程中为root提供密码(让<root-password>为密码)(不要忘记记住密码!)

  3. 选择使用传统密码加密选项(这是我使用的,没有尝试使用强密码加密选项)

  4. MySQL.prefPane(使用搜索工具)

    1. 选择配置选项卡
    2. 单击配置文件的选择选项
      1. 选择/private/etc/my.cnf
  5. 从终端打开一个名为/etc/my.cnf (vi /etc/my.cnf)的新文件或现有文件,添加以下内容:

     [mysqld]
    skip-grant-tables
    
  6. 重启mysqld如下:

    1. ps aux | grep mysql
    2. kill -9 <pid1> <pid2> ...(抓取所有MySQL相关进程的pid)
  7. mysqld自动重新启动

  8. 通过在终端上运行以下命令来验证该选项是否已设置:

     ps aux | grep mysql
    
    
    > mysql/bin/mysqld ... --defaults-file=/private/etc/my.cnf ... (output)
    
  9. 执行以下命令连接(以mysql-<version>-macos<version>-x86_64为安装MySQL的文件夹)。要获取实际的文件夹,运行ls /usr/local/并复制文件夹名称):

     /usr/local/mysql-<version>-macos<version>-x86_64/bin/mysql -uroot -p<root-password>
    

'-p'参数不要求参数名和值之间有空格。

而不是

./mysqladmin -u root -p 'redacted'

使用

./mysqladmin -u root -p'redacted'

或者只是

./mysqladmin -u root -p

这将提示您输入密码。

根据MariaDB官方文件,在MariaDB 10.4.3及以后版本中,默认安装了unix_socket身份验证插件。

为了禁用它,并恢复到前面的mysql_native_password身份验证方法,在my.cnf文件的[mysqld]部分中添加下面的行:

[mysqld]
unix_socket=OFF

然后运行:

mysql_install_db --auth-root-authentication-method=normal

然后启动mysqld

这个命令可以正常工作:

mysqladmin -u root password CHANGEME

有关更多信息,请参见配置mysql_install_db恢复上一种认证方式 . sh

有时会在安装时设置默认密码——文档中提到过。可以通过以下命令确认。

sudo grep 'temporary password' /var/log/mysqld.log

我试图利用Mac上的码头工人桌面来运行5.7.35,这个docker-compose.yml配置允许它工作:

特别是这一行…

命令:default-authentication-plugin = mysql_native_password

...这招奏效了

version: '3.3'
services:
mysql_db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'your_password'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- ~/your/volume/path:/var/lib/mysql

使用sudo修改密码:

sudo mysql


ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'insert_password';

来源:Phoenixnap - Access denied for user root localhost

在尝试了很多之后,给出了以下答案:

ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('root');

和类似的答案,我的终端仍然向我抛出以下错误:

你的SQL语法有错误;检查手册,对应于您的MariaDB服务器版本的正确语法使用近…

所以在网上研究后,这一行解决了我的问题,让我改变root用户密码:

sudo mysqladmin --user=root password "[your password]"

我在这里的位置:

  • < p > UBUNTU 21.04

  • < p > PHP 5.6.40-57

  • < p > MYSQL 5.7.37

我们来配置一下

nano /etc/mysql/mysql.conf.d/mysqld.cnf

在底部,写下这个

skip-grant-tables

重新加载它

service mysql restart

窗口:

cd \Ampps\mysql\bin:

mysql.exe -u root -pmysql

后mysql启动(你可以看到shell像这样mysql>) 使用这个查询:

 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

请再次使用root访问

需要检查的一件事是from-host筛选器。可能是“;localhost"默认情况下。您正在尝试从远程客户端连接吗?将此更改为“;%"”。

enter image description here

在Arch Linux上

包:mysql 8.0.29-1

对我有用的是:

  1. 编辑my.cnf文件,通常可以在/etc/mysql/my.cnf找到,并将skip-grant-tables附加在文件的底部/末尾。

  2. 通过调用sudo systemctl restart mysqld重新启动mysql服务

  3. 通过调用sudo systemctl status mysqld确保mysql服务已经正常启动

  4. 通过调用mysql -u root -p使用“root”登录mysql

  5. 通过调用flush privileges;刷新特权

  6. 通过CREATE USER 'root'@'localhost' IDENTIFIED BY 'rootpassword';创建新用户

  7. (如果你计划在PHP中使用这个db),你应该使用CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'rootpassword';

  8. 检查您的更改是否反映在db中,依次调用以下命令:

    • use mysql;
    • SELECT User, password_last_changed FROM user;
  9. 退出mysql控制台并编辑my.cnf文件注释/删除skip-grant-tables(参考步骤1的位置)

  10. 重启mysql服务(参考步骤2和步骤3)

就这些。