如何在 Linux 中重置 MySQL 根用户密码

你忘记了你的 MySQL root 用户密码吗? 不用担心! 本指南将引导您完成在 Linux 操作系统中重置 MySQL 根用户密码的步骤。 下面给出的步骤也应该适用于重置 MariaDB root 密码。

我们已经发布了指南 在 MySQL 中重置 root(管理)用户密码 旧版本,即 MySQL 5.7。 但是,该方法不适用于新的 MySQL 8 版本。 如果您想在 MySQL 8 中重置 root 密码,请遵循下面给出的两种解决方法中的任何一种。

内容

  1. 在 Linux 中重置 MySQL 根用户密码
    1. 1. 重置MySQL root密码的通用方法
    2. 2.用密码文件重置MySQL root密码
      1. 结论

在 Linux 中重置 MySQL 根用户密码

正如我已经提到的,我们可以通过两种方式重置 MySQL 根密码。

  • 通用的方式,
  • 使用 init_file 系统变量。

1. 重置MySQL root密码的通用方法

无论您使用何种操作系统,此方法都有效。 我警告你这是一个 不太安全 方式,因为我们要启动 MySQL 服务器 --skip-grant-tables 选项。 这使任何人都可以访问服务器 不受限制地访问所有数据库.

首先,使用命令停止 MySQL 服务:

$ sudo systemctl stop mysql

您可以使用以下命令验证 MySQL 是否真的停止了:

$ sudo systemctl status mysql

示例输出:

● mysql.service - MySQL Community Server       Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)       Active: inactive (dead) since Sat 2021-05-29 11:53:08 UTC; 8s ago      Process: 560 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)      Process: 666 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS)     Main PID: 666 (code=exited, status=0/SUCCESS)       Status: "Server shutdown complete"  May 29 10:08:33 ubuntu2004.localdomain systemd[1]: Starting MySQL Community Server…  May 29 10:08:37 ubuntu2004.localdomain systemd[1]: Started MySQL Community Server.  May 29 11:53:07 ubuntu2004.localdomain systemd[1]: Stopping MySQL Community Server…  May 29 11:53:08 ubuntu2004.localdomain systemd[1]: mysql.service: Succeeded.  May 29 11:53:08 ubuntu2004.localdomain systemd[1]: Stopped MySQL Community Server.

好吧,MySQL 服务没有运行。

现在,通过运行以下命令在没有权限检查的情况下重新启动 MySQL 服务器:

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

这里, --skip-grant-tables 选项使您可以在没有密码和所有权限的情况下连接到 mysql 数据库服务器。 这 --skip-networking 选项用于阻止其他客户端连接到数据库服务器。 而且,与号 (&) 符号用于在后台运行命令,因此您可以键入后续步骤中给出的其他命令。 请注意,上述命令是危险的,您的数据库服务器变得不安全并且容易受到安全威胁。 你应该 仅在短时间内运行此命令 重置密码。

您可能会看到以下错误:

2021-05-29T12:00:19.991826Z mysqld_safe Logging to '/var/log/mysql/error.log'. 2021-05-29T12:00:19.996942Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

如果您看到此错误,请创建缺少的目录(即 /var/run/mysqld) 并为它设置适当的权限,如下所示。

$ sudo mkdir -p /var/run/mysqld
$ sudo chown -R mysql:mysql /var/run/mysqld

现在再次尝试在没有密码和 root 权限的情况下启动 mysql 服务器:

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

接下来,使用命令连接到 mysql 服务器:

$ mysql

您将登陆 mysql shell 提示符。

 Welcome to the MySQL monitor.  Commands end with ; or g.  Your MySQL connection id is 7  Server version: 8.0.25-0ubuntu0.20.04.1 (Ubuntu)   Copyright (c) 2000, 2021, Oracle and/or its affiliates.   Oracle is a registered trademark of Oracle Corporation and/or its  affiliates. Other names may be trademarks of their respective  owners.   Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

由于我们登录时没有加载授权表(因为我们使用了 --skip-grant-tables 选项),我们不能用户 ALTER USER 命令重置密码。 所以让我们使用命令加载授权表:

mysql> FLUSH PRIVILEGES;

现在,运行以下命令来更新 mysql root 用户密码:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '[email protected]#@!';

在上面的命令中,替换 [email protected]#@! 用你自己的密码。 请注意,如果已启用 Validate Password 组件,您必须使用强密码。

最后,退出 mysql 提示符:

mysql> exit
在 Linux 中重置 MySQL 根用户密码

最后,关闭您之前启动的正在运行的数据库服务器 --skip-grant-tables 选项。 为此,请运行:

$ sudo mysqladmin -u root -p shutdown

您将被要求输入您的 sudo 密码后跟 MySQL root 您在上一步中设置的用户密码。

[sudo] password for ostechnix:  Enter password:  2021-05-29T12:09:38.425737Z mysqld_safe mysqld from pid file /var/lib/mysql/ubuntu2004.localdomain.pid ended [1]+  Done                    sudo mysqld_safe --skip-grant-tables --skip-networking

如果上面的命令不起作用,请找到 .pid file 包含服务器的进程 ID。 PID 文件通常在 /var/lib/mysql/ 或者 /var/run/mysqld/ 或者 /usr/local/mysql/data/ 目录取决于您的发行版、主机名和配置。 通常,文件名的扩展名为 .pid 并以 mysqld 或您系统的主机名。

就我而言,它是 "/var/lib/mysql/ubuntuserver.pid".

所以,我用命令停止了数据库服务器的实例:

$ sudo kill `/var/lib/mysql/ubuntuserver.pid`

请使用 反勾号 提到文件路径。

我们还可以使用以下命令找到 MySQL pid psgrep 命令如下:

$ ps ax | grep mysql

示例输出:

1930 pts/0 S 0:00 sudo mysqld_safe --skip-grant-tables --skip-networking 1931 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables --skip-networking 2091 pts/0 Sl 0:28 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=/var/log/mysql/error.log --pid-file=ubuntuserver.pid

手动杀死它,如下所示:

$ sudo kill <PID>

或者,杀死所有 MySQL 服务:

$ sudo  killall mysql

现在,使用命令正常启动 MySQL 服务:

$ sudo systemctl start mysql

现在,使用新密码登录 MySQL 服务器:

$ mysql -u root -p

示例输出:

使用新的 root 密码连接到 MySQL 服务器

2.用密码文件重置MySQL root密码

重置mysql root密码的另一种方法是使用 init_file 系统变量。

停止 MySQL 服务:

$ sudo systemctl stop mysql

创建一个文本文件,例如 ostechnix.txt

$ vi ostechnix.txt

在其中添加以下行:

ALTER USER 'root'@'localhost' IDENTIFIED BY '[email protected]#@!';

代替 [email protected]#@! 在上面的行中使用您自己的密码。 如果您已启用 Validate Password 插件,你应该指定一个强密码。 Save 和 close 文件。

现在,使用以下命令启动 MySQL 服务器 init_file 系统变量指向 ostechnix.txt 文件:

$ sudo mysqld --init-file=/home/sk/ostechnix.txt &

该命令将执行内容 ostechnix.txt 文件并更新 [email protected] 帐户密码与新密码中提到的 ostechnix.txt 文件,最后启动mysql服务器。

现在正常停止并重新启动mysql服务器:

$ sudo systemctl stop mysql
$ sudo systemctl start mysql

最后,删除密码文件即 ostechnix.txt.

$ rm /home/sk/ostechnix.txt

现在您可以使用以下命令使用新密码登录到 mysql 服务器:

$ mysql -u root -p

我们还发布了稍微不同的方法来重置 MySQL 根密码。 有关详细信息,请查看以下指南:

>> How To Reset Root Password In MySQL 8 On Ubuntu Linux

结论

在本指南中,我们学习了在 Linux 操作系统中重置忘记的 MySQL root 用户密码的两种不同方法。 如果您丢失了数据库管理帐户用户密码,您可以在几分钟内轻松重置它。

资源:

  • MySQL 8.0 参考手册

数据库LinuxMySQL重置mysql root密码疑难解答