MySQL 中的用户密码存储在用户表中, 密码重置实际上是改变该表中记录的值. 要在忘记密码的情况下更改密码, 我们的想法是绕过 MySQL 的身份验证进入系统并使用 SQL 命令更新记录密码值.
在 MySQL 5 中, 可以使用 --skip-grant-tables 选项启动 MySQL 服务, 此选项将告诉服务在启动时跳过加载授权表, 因此 root 用户可以使用空密码登录.
mysqld -skip-grant-tables
登录后, 可以在 SQL 命令下运行更改密码
UPDATE user SET authentication_string=''WHERE user='root';
这会将密码设置为空.
但是, 如果没有在 MySQL 8 中进行一些调整, 似乎 --skip-grant-tables 无法正常工作. 那么我们可以做些什么呢? 有两种可能的选择.
创建一个 --init-file. 并使用选项 --init-file 运行 MySQL 服务. 在 init 文件中, 输入要更新密码值的 SQL 命令.
深入研究如何在 MySQL 8 中使用 --skip-grant-tables.
我们来看看这些选项的工作原理.
选项 1: --init-file option
此选项将指定包含要在服务启动之前执行的 SQL 命令的文件. 因此, 我们只需要使用命令更新此文件中的密码并使用此选项启动 MySQL 服务. 密码将被重置 / 更新.
第 1 步: 停止 MySQL 服务
net stop MySQL
步骤 2: 创建一个 txt 文件, 并将下面的命令放入
ALTER USER 'root'@'localhost' IDENTIFIED BY '';
步骤 3: 在命令行上启动服务, 并使用 --init-file 选项
mysqld --init-file=/some/path/to/cmd.txt --console
完成. 注意: 当您遇到权限被拒绝的错误时, 请以特权用户身份运行该命令. 如果你看到如下错误:
- 2018-12-27T05:51:23.739089Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe (mysqld 8.0.13) starting as process 1912
- 2018-12-27T05:51:23.759426Z 1 [ERROR] [MY-011011] [Server] Failed to find valid data directory.
- 2018-12-27T05:51:23.761196Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
- 2018-12-27T05:51:23.762550Z 0 [ERROR] [MY-010119] [Server] Aborting
- 2018-12-27T05:51:23.766230Z 0 [System] [MY-010910] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Shutdown complete (mysqld 8.0.13) MySQL Community Server - GPL.
请运行以下命令初始化数据目录
mysqld --initialize --console
选项 2: 使用 --skip-grant-tables 选项
与 MySQL 5 相比, MySQL 8 中还需要添加更多选项.
mysqld --console --skip-grant-tables --shared-memory
启动服务后, 使用空密码登录
MySQL -u root
然后执行 SQL 命令更新密码
UPDATE MySQL.user SET authentication_string=''WHERE user='root'and host='localhost';
通常建议选项 1. 并希望本文对你有所帮助.
来源: http://www.linuxidc.com/Linux/2018-12/156052.htm