如何在CentOS7上更改MySQL root账户密码?

71

我已经在Centos7虚拟机上安装了mySQL,但是我用root登录时遇到了问题。我尝试了不输入密码或使用任何默认密码(如mysql、admin等),我查看了my.cnf文件,发现没有密码。我尝试通过停止服务并使用 mysqld_safe --skip-grant-tables & 重新启动来更改密码,但是我得到了 mysqld_safe:command not found 的错误信息。

我不知道还有什么可以做的。非常感谢任何提示/想法!


您需要指定命令的完整路径。如果您不知道它是什么,'find'可以帮到您。密码不应该在'my.cnf'中表达。 - tadman
7个回答

326

你使用的是哪个版本的mySQL?我使用的是5.7.10,以root用户登录时也遇到了相同的问题。

有两个问题 - 为什么我不能一开始就以root用户登录,以及为什么我无法使用'mysqld_safe'启动mySQL以重置root密码。

我无法回答如何在安装过程中设置root密码,但以下是重置root密码的方法:

编辑初始root密码可以通过运行以下命令找到:

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

http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html


  1. 现在使用 systemd 来管理 mySQL,而不是 mysqld_safe(这就是为什么会出现 -bash: mysqld_safe: command not found 错误 - 它没有被安装)

  2. user 表的结构已经改变。

因此,要重置 root 密码,您仍然需要使用 --skip-grant-tables 选项启动 mySQL 并更新 user 表,但如何执行已经发生了变化。

1. Stop mysql:
sudo systemctl stop mysqld

2. Set the mySQL environment option 
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

3. Start mysql usig the options you just set
sudo systemctl start mysqld

4. Login as root
mysql -u root

5. Update the root user password with these mysql commands
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPassword')
    -> WHERE User = 'root' AND Host = 'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit

*** Edit ***
As mentioned my shokulei in the comments, for 5.7.6 and later, you should use 
   mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
Or you'll get a warning

6. Stop mysql
sudo systemctl stop mysqld

7. Unset the mySQL envitroment option so it starts normally next time
sudo systemctl unset-environment MYSQLD_OPTS

8. Start mysql normally:
sudo systemctl start mysqld

Try to login using your new password:
7. mysql -u root -p

参考资料

正如在http://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html所述,

注意

从 MySQL 5.7.6 开始,对于使用 RPM 发行版进行的 MySQL 安装,在多个 Linux 平台上,服务器的启动和关闭由 systemd 管理。在这些平台上,不再安装 mysqld_safe,因为它是不必要的。有关更多信息,请参见第2.5.10节“使用 systemd 管理 MySQL 服务器”。

这将带您到http://dev.mysql.com/doc/refman/5.7/en/server-management-using-systemd.html ,其中在页面底部提到了systemctl set-environment MYSQLD_OPTS=

密码重置命令在http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html的底部。


1
谢谢!这个解决方案有效。我的系统没有找到mysql_safe..我不知道为什么这不被标记为解决方案。 - Mariano L
5
最终,我找到了清晰的工作指示。所有地方都提到了mysqld_safe命令,但在我的RedHat上找不到它。 - vogash
1
@Kevin Jones,“mysql -u root” 给我一个错误提示:“Access denied for user 'root'@'localhost' (using password: NO)” - Shishupal Shakya
2
这个方法在2020年8月2日的CentOS 7和MySQL CE v8.0.32-1.el7上没有成功。第5步的两种替代方案(“UPDATE…”或“ALTER USER…”)都没有起作用。遗憾的是,我现在无法使用systemctl启动而不使用“--skip-grant-tables”选项。此时最简单的方法是删除并重建虚拟机。 - Tom Stambaugh
3
正如Tom所说,这些指令都不起作用。当我移除skip-grant-tables时,它又显示"ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)"。我使用的是MariaDB版本:mysql Ver 15.1 Distrib 10.3.17-MariaDB,这是YUM在CentOS 8上安装的版本。 - PKHunter
显示剩余12条评论

27

我使用了Kevin Jones上面的建议,并采用以下 --skip-networking 更改,以获得稍微更好的安全性:

sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"

[user@machine ~]$ mysql -u root

尝试重置密码时出现错误,但在其他地方搜索后发现可以继续前进。以下操作成功:

mysql> select user(), current_user();
+--------+-----------------------------------+
| user() | current_user()                    |
+--------+-----------------------------------+
| root@  | skip-grants user@skip-grants host |
+--------+-----------------------------------+
1 row in set (0.00 sec)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'sup3rPw#'
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'sup3rPw#'
Query OK, 0 rows affected (0.08 sec)

mysql> exit
Bye
[user@machine ~]$ systemctl stop mysqld
[user@machine ~]$ sudo systemctl unset-environment MYSQLD_OPTS
[user@machine ~]$ systemctl start mysqld

那时候我能够登录。


2
@user48918 “mysql -u root” 给我一个错误,显示“用户root@localhost的访问被拒绝(未使用密码)”。 - Shishupal Shakya

14

使用以下步骤重置密码。

$ sudo systemctl start mysqld

重置 MySql 服务器的 root 密码。

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

生成如下输出:

 10.744785Z 1 [Note] A temporary password is generated for root@localhost: o!5y,oJGALQa

在重置mysql_secure_installation过程中,请使用上面提供的密码。

<pre>
    $ sudo mysql_secure_installation
</pre>
   Securing the MySQL server deployment.

   Enter password for user root: 

您已成功重置 MySql 服务器的 root 密码。使用以下命令检查是否连接到 mysql 服务器。

$ mysql -u root -p

http://gotechnies.com/install-latest-mysql-5-7-rhelcentos-7/


1
据我所理解,这仅在服务器首次创建时起作用。grep 命令所做的只是查找临时密码,而不是设置它。 - krypticbit

11

对于 CentOS 7MariaDB 10.4,我使用以下命令成功:

su -
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --user=mysql"
systemctl restart mariadb
mysql -u root

flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
flush privileges;
quit

systemctl unset-environment MYSQLD_OPTS
systemctl restart mariadb

1
工作得很好! - Arief Wijaya
1
无法工作。即使在所有这些操作之后,当我删除MYSQLD_OPTS并输入正确的密码时,命令行仍然显示“ERROR 1045(28000):用户'root'@'localhost'被拒绝访问(使用密码:YES)”。使用最新版本 - “mysql Ver 15.1 Distrib 10.3.17-MariaDB”。 - PKHunter
此外,您需要在第一次刷新权限之后的命令中添加“use mysql”。 - PKHunter
@PKHunter 除了使用MariaDB 10.3之外,您在其他答案中的评论表明您还在使用CentOS 8,而这显然不是为CentOS 7编写的答案。 (仅供参考,我已经标记了您在此问题的各种答案中的大多数(而不是全部)评论,以进行审查并可能删除。有关更多信息,请阅读行为准则。根据我的个人经验,在撰写有问题的评论之前,通常最好确保血糖足够,并等待几个小时。) - lauxjpn
1
@PKHunter 感谢您的理解。我会查看您的新问题,但可能需要一两个小时,因为我可能需要先设置一个带有CentOS 8的虚拟机。 - lauxjpn
显示剩余3条评论

8

大家好,

这里有一个关于mysql-community-server 5.7的小技巧。我会分享一些步骤,来重置mysql5.7的root密码或设置密码。这适用于centos7和RHEL7。

第一步:停止你的数据库

service mysqld stop

第二步:修改/etc/my.cnf文件,添加 "skip-grant-tables"。

vi /etc/my.cnf
[mysqld]
skip-grant-tables

步骤3. 启动mysql

service mysqld start

步骤4. 选择mysql默认数据库

mysql -u root

mysql>use mysql;

步骤4. 设置新密码

mysql> update user set authentication_string=PASSWORD("yourpassword") where User='root';

步骤5. 从/etc/my.cnf文件中删除skip-grant-tables

步骤6. 重新启动mysql数据库。

service mysqld restart

mysql -u root -p

尽情享受 :)


请明确一点,完成后应该从my.cnf中删除skip-grant-tables。它是不安全的,因为它不需要密码。这不是很明智的建议。 - PKHunter

2
请使用以下命令停止所有MySQL服务: /etc/init.d/mysqld stop 然后使用以下命令: mysqld_safe --skip-grant-tables 这可能可以正常工作。

1

对我而言,操作如下: 1. 停止mysql: systemctl stop mysqld

  1. 设置mySQL环境选项 systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

  2. 使用刚刚设置的选项启动mysql systemctl start mysqld

  3. 以root身份登录 mysql -u root

  4. 登录后,我使用FLUSH PRIVILEGES;命令告诉服务器重新加载授权表,以使帐户管理语句生效。 如果我不这样做,尝试更新密码时会收到以下错误提示: "Can't find any matching row in the user table"


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