MySQL 5.7的默认root密码是什么?

88
新安装的MySQL数据库无法使用root ID和空/无密码登录,就像其他旧版本的MySQL一样。

6
因为 root 不使用密码,所以现在没有 root 密码。默认情况下,认证方法是通过 auth socket 进行认证。如果需要在没有 root 系统访问权限的情况下进行 root lmysql 登录,请使用 sudo 获取 root 访问权限,将认证方法更改为密码并设置密码。请注意,翻译后的内容与原文意思相同,通俗易懂,没有其他额外的信息或解释。 - G.Martin
3
@G.Martin,你能否将这条评论扩展为更详细的步骤,并使其更易于理解,但不改变原意?我认为这是我想要使用的解决方法,但我不知道如何更改认证方式。(sudo mysql -u root 对我有用 - 我想更改它以便我只需使用 mysql -u root 而无需输入密码) - Max Williams
抱歉,你可能已经发现了,但我发现我的帖子只适用于Debian发行版。如果仍然存在问题(我怀疑),我可以提供更多细节。 - G.Martin
14个回答

178

有很多答案建议重新安装mysql或使用一些组合方法。

mysqld_safe --skip-grant-tables

and / or

UPDATE mysql.user SET Password=PASSWORD('password')

和其他一些东西...

...对我都没有用


以下是在Ubuntu 18.04上为我工作的方法,从头开始

特别鸣谢这篇答案帮我解决了这个问题带来的挫败感...

$ sudo apt install mysql-server
$ sudo cat /etc/mysql/debian.cnf

Note the lines which read:

user     = debian-sys-maint
password = blahblahblah

然后:

$ mysql -u debian-sys-maint -p
Enter password: // type 'blahblahblah', ie. password from debian.cnf

mysql> USE mysql
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | auth_socket           |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)

mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> COMMIT;  // When you don't have auto-commit switched on

要么:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

或者:

// For MySQL 5.7+
UPDATE mysql.user SET authentication_string=PASSWORD('new_password') where user='root';

然后:

mysql> FLUSH PRIVILEGES;
mysql> COMMIT;  // When you don't have auto-commit switched on
mysql> EXIT

$ sudo service mysql restart
$ mysql -u root -p
Enter password: // Yay! 'new_password' now works!

5
我按照这些步骤操作,但是没有成功。一切看起来都很好,但只要我重新启动MySQL,插件值就会重置为auth_socket。你有什么想法吗? - Matt Raible
4
起初对我没有效果。然后我尝试在退出之前发出 COMMIT,它就起作用了! - LeandroG
3
对我有用的是,但与其使用 "mysql -u debian-sys-maint -p",我需要使用 "sudo mysql -u root"。当我使用第一个命令时,即使使用 COMMIT,更改也未被保存。 - Peter
2
在执行 FLUSH PRIVILEGES; 命令之前需要先执行 commit; - Eric
3
测试过了。默认安装在 18.04 LTS 上的 Mysql 5.7+ 通过 UPDATE mysql.user SET authentication_string=PASSWORD('new_password') where user='root'; 更改密码,因此您需要运行该命令而不是 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; - message
显示剩余13条评论

123

8
谢谢!在这里找到这些信息有点疯狂,而不是在Oracle的MySQL 5.7文档中找到。 - maddin2code
8
这拯救了我的生命...我到处寻找解决方案,而这个解决了我所有的问题。甚至mysql网站的文件也没有提到过这个。太疯狂了。谢谢! - nodeffect
22
我的(mint上的mariadb) /var/log/mysqld.log 不存在。 - donquixote
10
对于那些找不到/var/log/mysqld.log的人,只需运行sudo mysql_secure_installation。请记得用sudo运行该命令,否则将会收到“访问被拒绝”的错误提示。 - wpclevel
2
如果MySQL root帐户使用“auth_socket”插件,则“sudo mysql_secure_installation”将绝对无效。我在下面的我的答案中进行了详细说明。 - Julian - BrainAnnex.org
显示剩余6条评论

35

MySQL 5.7更改了安全模型:现在需要使用sudo才能登录MySQL root。

最简单(也是最安全)的解决方案是创建一个新用户并授予所需的权限。

1. 连接到mysql

sudo mysql --user=root mysql

2. 为phpMyAdmin创建一个用户

CREATE USER 'phpmyadmin'@'localhost' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

参考 - https://askubuntu.com/questions/763336/cannot-enter-phpmyadmin-as-root-mysql-5-7


8
说实话,一开始我觉得这个答案相当愚蠢,于是尝试了很多其他方法,包括在本地的Ubuntu机器上搜索不存在的随机生成密码的文件。然而,一个简单的SUDO和空密码就解决了问题。点个赞! - MrTony

15

我的新Linux Mint 19已经默认安装了MySQL服务器5.7。

但是,MySQL的root密码是什么?事实证明:

默认安装使用auth_socket进行身份验证,而不是密码!

它允许无需密码登录,前提是已使用相同的用户名登录Linux系统。要作为MySQL根user登录,可以使用sudo:

sudo mysql --user=root

但是如何更改根密码呢?为了说明情况,我创建了一个名为“me”的新用户,拥有完全的特权,具体步骤如下:

mysql> CREATE USER 'me'@'localhost' IDENTIFIED BY 'my_new_password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'me'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

与 "root" 相比较:

mysql> SELECT user, plugin, HEX(authentication_string)  FROM mysql.user WHERE user = 'me' or user = 'root';
+------+-----------------------+----------------------------------------------------------------------------+
| user | plugin                | HEX(authentication_string)                                                 |
+------+-----------------------+----------------------------------------------------------------------------+
| root | auth_socket           |                                                                            |
| me   | mysql_native_password | 2A393846353030304545453239394634323734333139354241344642413245373537313... |
+------+-----------------------+----------------------------------------------------------------------------+

因为它使用了auth_socket,所以无法更改root密码:执行SET PASSWORD命令会失败,而mysql_secure_installation则无法实现任何目标...

==> 要取消此替代身份验证模式并使MySQL的root用户重新使用密码:

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

一份 好的解释。

更多MySQL手册中的细节


8

如果您想无人值守安装MySQL或Percona(例如在我的情况下使用Ansible),可以使用以下脚本:

# first part opens mysql log
# second part greps lines with temporary password
# third part picks last line (most recent one)
# last part removes all the line except the password
# the result goes into password variable

password=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n 's/.*root@localhost: //p')

# setting new password, you can use $1 and run this script as a file and pass the argument through the script

newPassword="wh@teverYouLikE"

# resetting temporary password

mysql -uroot -p$password -Bse "ALTER USER 'root'@'localhost' IDENTIFIED BY '$newPassword';"

猫:/var/log/mysqld.log:没有这个文件或目录。我使用的是Ubuntu 18.04,并通过tasksel安装了它。你有什么建议吗? - AboElnouR
我会搜索它:find / -name mysqld 2>/dev/null - hpaknia

6
MySQL 5.7或更新版本在全新安装后会生成默认的临时密码。
要使用MySQL,您首先需要从位于/var/log/mysqld.log的日志文件中获取该密码。因此,请遵循以下过程:
  1. grep 'temporary password' /var/log/mysqld.log

  2. mysql_secure_installation

第二个命令是必需的,可以更改MySQL的密码,并进行其他某些更改,例如删除临时数据库、允许或拒绝root用户的远程访问、删除匿名用户等等。

6

看起来事情是设计成避免开发人员设置root用户,更好的解决方案应该是:

sudo mysql -u root

接下来创建一个普通用户,设置密码,然后使用该用户进行工作。

create user 'user'@'localhost' identified by 'user1234';
grant all on your_database.* to 'user'@'localhost';
select host, user from mysql.user;

然后尝试访问:

mysql -u user -p

砰!


1
不是的。它的设计目的是为root设置密码,而不是空密码。 - Ryan
1
默认情况下,它仅设计为通过本地套接字与root连接。无论如何,即使是在开发中,使用root连接MySQL也是一种不好的做法,我的答案描述了如何使用创建实际工作的非root用户的良好实践。 - Pablo Pazos

4

经过多次尝试,我使用以下命令(适用于Ubuntu及其衍生版本)成功重置了默认密码:

sudo -i
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &
mysql -uroot
use mysql;
update user set authentication_string=password('YOURPASSWORD') where user='root';
update user set plugin="mysql_native_password" where User='root';  
flush privileges;
quit;
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start

有时候,即使在终端中输入了命令
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &

我遇到了mysqld不存在的错误。所以退出,然后再次输入相同的命令。
最后的命令是:
sudo /etc/init.d/mysql start

有时候不起作用,只有在重新启动电脑后才能正常运行。


1
在Ubuntu Bionic 18.04 Mysql 5.7.29上工作过。只是想添加版本信息。谢谢。 - Gavin Simpson

4

对于Ubuntu Server 18.04.1和MySQL 5.7.23,以上回答都无法解决我的问题。我花了很多时间尝试手动设置密码和认证插件,查找日志中的密码(但并没有找到),结果一直失败。

实际上,解决方法非常简单:

sudo mysql_secure_installation

使用sudo执行此操作非常重要。如果未提升权限,您将被要求输入root密码,而您显然没有这个密码。


1
我刚刚在我的计算机上安装了基于Ubuntu 18.04的Linux Mint 19。我从repo中安装了MySQL 5.7 (sudo apt install mysql-server),但令人惊讶的是,在安装过程中,设置没有提示输入root密码。因此,我无法登录MySQL。我在网上搜索了很多,尝试了各种答案,包括上面接受的答案。我卸载了MySQL(使用mysql名称清除所有dpkg),然后再次从默认的Linux Mint存储库重新安装。都没有成功。
经过数小时的无效工作,我决定从官方页面重新安装MySQL。我打开了MySQL下载页面(https://dev.mysql.com/downloads/repo/apt)以获取apt repo,并单击右下角的Download按钮。
接下来,使用dpkg运行它:
sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb

在安装设置中,选择您想要安装的MySQL版本。默认选项是8.0,但我将其更改为5.7。单击“确定”退出。完成后,您的软件源中将有一个新的MySQL仓库。
更新您的仓库:
sudo apt update

最后,安装MySQL:
sudo apt install mysql-server

现在我被提示提供root密码!希望这能对其他遇到同样问题的人有所帮助。


1
我花了好几天的时间在Ubuntu仓库中安装mysql-server,但最终发现官方提供的MySQL版本才是可行的。 - Inam Ul Huq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接