如何找出我的MySQL根密码?


73

我刚刚在Ubuntu上安装了MySQL,root用户无法登录:)

我该如何找回密码?使用空白输入密码不起作用。

Answers:


140

您可以--skip-grant-tables通过使用以下命令以root用户身份(或使用sudo)运行以下服务器来重设root密码,并使用密码运行服务器,而无需密码登录:

# service mysql stop
# mysqld_safe --skip-grant-tables &
$ mysql -u root
mysql> use mysql;
mysql> update user set authentication_string=PASSWORD("YOUR-NEW-ROOT-PASSWORD") where User='root';
mysql> flush privileges;
mysql> quit
# service mysql stop
# service mysql start
$ mysql -u root -p

现在,您应该可以使用新密码以root用户身份登录。

也可以在其中/home/$USER/.mysql_history或重设密码/root/.mysql_history的用户中找到重设密码的查询,但是以上操作始终有效。

注:之前的MySQL 5.7列被称为password代替authentication_string。将上面的行替换为

mysql> update user set password=PASSWORD("YOUR-NEW-ROOT-PASSWORD") where User='root';

4
@Benjamin我做了回答中的所有步骤,但仍然对用户'root'@'localhost'拒绝访问-任何想法为什么?
Genadinik

4
对于MySql 5.7:更新mysql.user SET authentication_string = PASSWORD('MyNewPass'),password_expired ='N'WHERE User ='root'AND Host ='localhost';
TungstenX

22
在尝试了所有这些dpkg方法和下面的方法之后,并且让我非常沮丧,因为没有任何效果(顺便说一句,我正在使用16.04和mysql-sever-5.7),我注意到如果我使用sudo进行连接,mysql将接受我的新凭据。即sudo mysql -u root -p 没有须藤我得到Access denied for user 'root'@'localhost'。之前我从来没有使用过sudo,也没有在这里提到它,但是经过一个令人沮丧的小时之后,这似乎是解决方案。
马特

1
@马特在这里一样。sudo在使用mysql之前,我从未使用过,现在必须使用吗?我不明白为什么我必须成为root Linux用户才能访问mysql中的root帐户。这种行为使我想起了postgresql。
JMac

3
对于只能以shell根身份登录的任何人,请查看此askubuntu.com/questions/766334/…–
lucaswxp

20

我意识到这是一个旧线程,但是我想我将用我的结果对其进行更新。

Alex,听起来像您是通过元软件包“ mysql-server”安装了MySQL服务器。这将通过引用安装最新的软件包(在我的情况下为mysql-server-5.5)。我和您一样,没有像我期望的那样在安装时提示输入MySQL密码。我想有两个答案:

解决方案1:以全名安装MySQL:

$ sudo apt-get install mysql-server-5.5

要么

解决方案#2:重新配置软件包...

$ sudo dpkg-reconfigure mysql-server-5.5

您必须指定完整的软件包名称。使用元软件包“ mysql-server”对我来说没有理想的结果。我希望这可以帮助别人 :)

参考:https : //help.ubuntu.com/12.04/serverguide/mysql.html


谢谢!我一直在尝试sudo dpkg-reconfigure mysql-server,但这没有用。
罗斯·罗杰斯

1
这成功了,但是没有问我在Ubuntu 18.04中输入MySQL的root密码:sudo dpkg-reconfigure mysql-server-5.7
anon58192932 '18

是的,也正在运行5.7,重新配置不会要求输入root密码...?有什么用,默认值是什么?
阿恩(Arne)

17
sudo mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR_PASSWORD_HERE';
FLUSH PRIVILEGES;

mysql -u root -p # and it works

2
这是唯一在ubuntu 16.04 LTS上对我有用的解决方案
Rajesh,

谢谢。您的解决方案为我工作。该帖子的作者应已指定他的MySQL版本。我的是5.7.27
阿斯卡

9

在Ubuntu 14.04上的MySQL 5.5需要稍微不同的命令,如这里推荐的。简而言之:

sudo /etc/init.d/mysql stop
sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking &
mysql -u root

然后从MySQL提示符

FLUSH PRIVILEGES;
SET PASSWORD FOR root@'localhost' = PASSWORD('password');
UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root';
FLUSH PRIVILEGES;

所引用的源提供的另一种方法为好。


您能否提供有关以下确切功能的帮助并提供详细信息? --skip-grant-tables --skip-networking & 对我来说,解决客户的需求真的很有帮助,但我想了解一下,这样我可以评估风险。谢谢!
仍在质疑

skip-grant-tables当然,需要谨慎,因为有权访问服务器的任何人都可以访问该实例的所有架构。 skip-networking我认为问题不大,但您应该自己评估。如果我想在没有当前root密码的情况下重置root密码,我认为自己已经在安全管理器中了:)。不确定是否有更“安全”的方法。
eebbesen 2014年

1
我收到此错误2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器[1] +退出1 sudo / usr / sbin / mysqld --skip -grant-tables --skip-networking
Hos Mercury

4

对于RHEL-mysql 5.5:

/etc/init.d/mysql stop

/etc/init.d/mysql start --skip-grant-tables

 mysql> UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root';
 mysql> FLUSH PRIVILEGES;
 mysql> exit;

mysql -uroot -pnewpwd

mysql>  

2
您的答案可能会更详细。请说明您建议的命令。
Pablo Jomer

2

嗯,Mysql 5.7.13重置我所做的一切是:

$ sudo service mysql stop 停止mysql

$ mysqld_safe --skip-grant-tables & 启动mysql

$ mysql -u root

就像正确的答案一样。然后我所做的就是做@eebbesen所做的事情。

mysql> SET PASSWORD FOR root@'localhost' = PASSWORD('NEW-password-HERE');

希望它可以帮助任何人:)


2

这是设置root密码的最佳方法:Source Link步骤3对我来说非常有效。

给你的命令

  1. 须藤MySQL
  2. 选择用户,authentication_string,插件,主机from mysql.user;
  3. ALTER USER'root'@'localhost'由mysql_native_password标识为'password';
  4. 冲洗特权;
  5. 选择用户,authentication_string,插件,主机from mysql.user;
  6. 出口

现在您可以将root用户的密码设置为' password ':

  1. mysql -u root -p
  2. 创建用户'sammy'@'localhost'由'password'标识;
  3. 授予所有特权使用格兰特选项将'sammy'@'localhost';
  4. 冲洗特权;
  5. 出口

测试您的MySQL服务和版本:

systemctl status mysql.service
sudo mysqladmin -p -u root version

1

在MYSQL 5.7下,如果您使用mysql进行开发,则:

1.杀死mysql:

$ sudo service mysql stop

2.在--skip-grant-tables模式下启动mysql:

$ sudo mysqld_safe --skip-grant-tables 

而且,您可以尝试在“ skip-grant-table”模式下更改用户表,但是我失败了。

因此,这只是一种解决方法。




0

由于不确定,我将在这里做一个假设。我认为我的MySQL(在最新的20.04版本上运行)甚至没有根。我曾尝试设置一个,但记得有问题。我怀疑没有root用户,如果您以root用户身份登录,它将自动以MySQL root用户身份登录。

我为什么这么认为呢?因为当我执行MySQL -u root -p时,它将接受任何密码,并以root用户身份登录时以MySQL root用户身份登录。

我已经确认在非root用户上尝试不起作用。

我喜欢这个模特。

编辑2020.12.19:我不再是一个谜,为什么如果您以root用户身份登录,root用户身份登录MySQL。它与身份验证类型有关。更高版本的MySQL使用MySQL插件“ auth_socket”进行配置(也许您已经注意到系统上的/run/mysqld/mysqld.sock文件并对此有所疑惑)。该插件使用库auth_socket.so提供的SO_PEERCRED选项。

如果需要,您可以简单地通过创建/更新密码来恢复到密码验证。在下面显示两种方式和选项以使其清晰。

使用auth_socket创建用户'valerie'@'localhost';
创建用户'valerie'@'localhost'由'password'标识;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.