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

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

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

在 Linux 中重置 MySQL 根用户密码

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

  • 通用方式,
  • 使用 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`

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

我们还可以使用 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

创建一个文本文件,用于 example 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 root 密码。 查看以下指南了解详细信息:

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

结论

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

资源: