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

时间:2020-03-21 11:47:35  来源:igfitidea点击:

我们已经发布了在旧的MySQL版本中重置root(管理)用户密码的教程,例如5.7.

但是,该方法不适用于较新的MySQL 8版本。
经过查看官方MySQL文档教程,我学习以下两个解决方法以重置MySQL 8中的root密码。

在Linux中重置MySQL root用户密码

就像我已经提到的那样,我们可以通过两种方式重置MySQL root密码。

  • 通用方式
  • 使用init_file系统变量

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

无论我们使用的操作系统如何,此方法都将起作用。
这是一种不太安全的方式。

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

$sudo systemctl stop 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 Wed 2017-06-03 09:00:51 UTC; 7s ago
    Process: 853 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS)
   Main PID: 853 (code=exited, status=0/SUCCESS)
     Status: "Server shutdown complete"
Jun 03 08:23:31 ubuntuserver systemd[1]: Starting MySQL Community Server...
Jun 03 08:24:04 ubuntuserver systemd[1]: Started MySQL Community Server.
Jun 03 09:00:49 ubuntuserver systemd[1]: Stopping MySQL Community Server...
Jun 03 09:00:51 ubuntuserver systemd[1]: mysql.service: Succeeded.
Jun 03 09:00:51 ubuntuserver systemd[1]: Stopped MySQL Community Server.

正如我们所看到的,MySQL服务未运行!

现在,通过运行以下命令,启动MySQL Server而不进行权限检查:

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

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

我们可以查看以下错误:

020-06-03T09:26:34.529219Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2017-06-03T09:26:34.532724Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

如果我们看到此错误,请创建丢失的目录(即/var /运行/mysqld),并将其设置为下面的正确权限。

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

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

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

接下来,使用命令连接到MySQL Server:

$mysql

我们将登陆MySQL Shell提示。

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

由于我们在不加载授权表的情况下登录(因为我们使用了--skip-grant-tables选项),我们无法使用用户命令重置密码。
因此,让我们使用命令加载授权表:

mysql> FLUSH PRIVILEGES;

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

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hyman@theitroad#@!';

在上面的命令中,替换"Hyman @ theitroad#@!"使用我们自己的密码。

请注意,如果已启用验证密码组件,则可能需要使用强密码。

最后,退出MySQL提示符:

mysql> exit

最后,关闭我们之前开始的正在运行的数据库服务器--skip-grant-tables选项。
为此,运行:

$sudo mysqladmin -u root -p shutdown

我们将被要求输入我们在上一步中设置的MySQL root用户密码。

[sudo] password for theitroad: 
Enter password: 
2017-06-03T10:12:55.737848Z mysqld_safe mysqld from pid file /var/lib/mysql/ubuntuserver.pid ended
[1]+  Done                    sudo mysqld_safe --skip-grant-tables --skip-networking

如果上面的命令不起作用,请找到包含服务器进程ID的.pid文件。
PID文件通常可在/var/lib/mysql /或者/var /运行/mysqld /或者/usr/local/mysql/data /目录中使用,具体取决于分发,主机名和配置。
通常,文件名具有.pid的扩展名,并以MySQLD或者系统的主机名开头。

在我的情况下,它是"/var/lib/mysql/ubuntuserver.pid"。

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

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

请使用后退键来提及文件路径。

我们还可以使用以下内容找到MySQL PID和"PS"和"Grep"命令:

$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 Server:

$mysql -u root -p

示例输出:

方法2 - 使用密码文件重置MySQL root密码

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

停止MySQL服务:

$sudo systemctl stop mysql

创建文本文件,例如theitroad.txt:

$vi theitroad.txt

添加以下行:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hyman@theitroad#@!';

替换"Hyman @ theitroad#@!"在上面的线条上有自己的密码。

如果已启用验证密码插件,则应指定强密码。
保存并关闭文件。

现在,使用指向theitroad.txt文件的init_file系统变量启动MySQL Server:

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

此命令将执行onitad.txt的内容,并在theitroad.txt文件中提到的新密码更新"Hyman @ theitroad"帐户密码,最后启动MySQL服务器。

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

$sudo systemctl stop mysql
$sudo systemctl start mysql

最后,删除密码文件(onitad.txt)。

$rm /home/sk/theitroad.txt

现在,我们可以使用命令使用新密码登录MySQL Server:

$mysql -u root -p