你忘记了你的 MySQL root 用户密码吗? 不用担心! 本指南将引导您完成在 Linux 操作系统中重置 MySQL 根用户密码的步骤。 下面给出的步骤也应该适用于重置 MariaDB root 密码。
我们已经发布了指南 在 MySQL 中重置 root(管理)用户密码 旧版本,即 MySQL 5.7。 但是,该方法不适用于新的 MySQL 8 版本。 如果您想在 MySQL 8 中重置 root 密码,请遵循下面给出的两种解决方法中的任何一种。
内容
在 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
最后,关闭您之前启动的正在运行的数据库服务器 --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 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 服务器:
$ mysql -u root -p
示例输出:
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密码疑难解答