《MySQL密码忘了?别慌!试试这个“黑客级“救援方案》

目录

前言

一、skip-grant-tables重置MySQL密码

1.核心原理

2.具体行为

3.操作实践

二、init-file重置MySQL密码(推荐)

1.核心原理

2.关键特性

3.操作实践

总结


前言

作为数据库管理员,最尴尬的时刻莫过于被自己管理的MySQL数据库拒之门外。忘记root密码就像把钥匙锁在了保险箱里,而--skip-grant-tablesinit-file就是你的专业开锁工具。本文以MySQL-8.0.41版本为例进行实践讲解。

一、skip-grant-tables重置MySQL密码

1.核心原理

MySQL的权限验证是通过mysql.user表实现的,而--skip-grant-tables启动参数会直接 绕过整个权限验证流程,相当于给数据库装了一个"临时后门"。

2.具体行为

  • ✅ 禁用权限表加载:不读取mysql.usermysql.db等权限表

  • ✅ 允许无密码登录:任何用户(包括匿名用户)都能以超级权限连接

  • ✅ 仅限本地连接(默认情况下,防止远程滥用)

3.操作实践

①停用mysql服务

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# systemctl status mysqld
○ mysqld.service - MySQL 8.0 database server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; preset: disabled)
     Active: inactive (dead)

6月 24 10:24:25 localhost systemd[1]: Starting MySQL 8.0 database server...
6月 24 10:24:26 localhost systemd[1]: Started MySQL 8.0 database server.
6月 24 10:34:15 localhost systemd[1]: Stopping MySQL 8.0 database server...
6月 24 10:34:16 localhost systemd[1]: mysqld.service: Deactivated successfully.
6月 24 10:34:16 localhost systemd[1]: Stopped MySQL 8.0 database server.
6月 24 10:34:29 localhost systemd[1]: Starting MySQL 8.0 database server...
6月 24 10:34:31 localhost systemd[1]: Started MySQL 8.0 database server.
6月 24 14:37:07 localhost systemd[1]: Stopping MySQL 8.0 database server...
6月 24 14:37:09 localhost systemd[1]: mysqld.service: Deactivated successfully.
6月 24 14:37:09 localhost systemd[1]: Stopped MySQL 8.0 database server.
[root@localhost ~]# ps -ef | grep mysqld
root     3763535  330474  0 14:37 pts/2    00:00:00 grep --color=auto mysqld
[root@localhost ~]# 

②编辑mysql配置文件,添加skip-grant-tables参数

[root@localhost ~]# vi /etc/my.cnf.d/mysql-server.cnf # 默认配置文件路径

在配置文件中的[mysqld]配置项中添加内容:skip-grant-tables,添加后保存即可。

③重启数据库,无密码登录验证

[root@localhost ~]# systemctl restart mysqld

命令行测试:mysql -uroot;成功跳过了密码认证,进入到了MySQL命令行,接下来进行密码修改。

④root密码修改

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> alter user 'root'@'localhost' identified by 'Mydb@135246';
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

如上图修改密码成功,将MySQL配置文件中的skip-grant-tables配置注释或删除重启MySQL服务进行新密码登录验证。

[root@localhost ~]# systemctl restart mysqld

注:修改密码之前一定要flush  privileges 刷新权限,否则会报错;如下:

mysql> alter user 'root'@'localhost' identified by 'Mydb@135246';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

⑤验MySQL证新密码登录

[root@localhost ~]# mysql -u root -pMydb@135246
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.41 Source distribution

Copyright (c) 2000, 2025, 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.

mysql> 

成功进入,密码修改成功!

二、init-file重置MySQL密码(推荐)

1.核心原理

init-file参数让MySQL在启动时 自动执行指定文件中的SQL语句,且这些语句会在权限系统初始化之前执行。

2.关键特性

  • 🚀 优先于权限检查:SQL在权限系统生效前执行

  • 📜 支持多语句:可包含ALTER USERUPDATE mysql.user等操作

  • ⏱️ 一次性执行:仅在服务启动时运行一次

3.操作实践

①停用mysql服务

[root@localhost ~]# systemctl stop mysqld

②创建修改密码sql文件

[root@localhost mysql]# vi  /var/lib/mysql/mysql-reset-pwd.sql

填写如下sql语句,然后保存。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyDB@0678';

注:密码设置不能过于简单化,需8字符以上、包含大小写字母和特殊字符为佳。

给予sql文件执行权限:

[root@localhost mysql]# chmod +x /var/lib/mysql/mysql-reset-pwd.sql

③在MySQL配置文件添加参数指定启动时执行编写修改密码的sql文件并重启数据库

[root@localhost mysql]# vi /etc/my.cnf.d/mysql-server.cnf  # MySQL默认配置文件路径

在配置文件中的[mysqld]中添加init-file内容,文件路径记得更换为自己实际的路径,确保编写的sql文件及文件所在的目录拥有足够的权限。

④配置完成之后,systemctl  restart  mysqld 重启MySQL服务。

⑤验证新密码登录

[root@localhost ~]# mysql -uroot -pMyDB@0678
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.41 Source distribution

Copyright (c) 2000, 2025, 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.

mysql> 

成功进入MySQL命令行,密码修改成功!

总结

掌握--skip-grant-tablesinit-file方法等于拥有了MySQL的万能钥匙,但请记住:
"With great power comes great responsibility"
——能力越大,责任越大。仅在必要时使用此方法,并始终遵循安全最佳实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NotStrandedYet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值