MySQL忘记密码的解决方案
问题背景
MySQL密码遗忘或丢失是常见问题,尤其在多环境管理时。需要在不影响数据的前提下重置或导出密码。
适用场景
- 无法通过常规方式登录MySQL
- 需从现有连接工具(如Navicat)中恢复密码
- 服务器权限受限时的应急处理
方法一:通过MySQL安全模式重置密码
原理
通过跳过权限表启动MySQL服务,直接修改用户密码。
操作流程
-
停止MySQL服务
sudo systemctl stop mysql -
启动无权限验证的MySQL
mysqld_safe --skip-grant-tables & -
修改root密码
UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root'; FLUSH PRIVILEGES;
注意事项
- 需具有服务器管理员权限
- 执行后需重启MySQL正常服务
方法二:通过Navicat导出已保存的密码(尽量在自己本地进行导出防止密码泄露)
前提条件
- Navicat已保存过该MySQL连接
- 本地未加密存储连接配置
操作步骤
-
通过Navicat导出数据库链接

-
选中需要导出的数据库并勾选导出密码

-
执行程序进行解密
import cn.hutool.core.io.file.FileReader; import cn.hutool.crypto.symmetric.AES; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import java.util.Iterator; public class NavicatDecrypt { public static void main(String[] args) throws DocumentException { // 整体参考:http://t.zoukankan.com/lori-p-15686959.html // 指定导出文件 FileReader fileReader = new FileReader("Navicat导出的文件路径"); String result = fileReader.readString(); System.out.println("==================获取文件内容=================="); System.out.println(result); Document document = DocumentHelper.parseText(result); Element root = document.getRootElement(); Iterator<Element> connectionList = root.elementIterator("Connection"); connectionList.forEachRemaining(v -> { Element connection = v; System.out.println("==================获取导出参数=================="); String connectionName = connection.attributeValue("ConnectionName"); String connType = connection.attributeValue("ConnType"); String host = connection.attributeValue("Host"); String port = connection.attributeValue("Port"); String userName = connection.attributeValue("UserName"); String encryptPassword = connection.attributeValue("Password"); String database = connection.attributeValue("Database"); System.out.println("1.------->连接名称:" + connectionName); System.out.println("2.------->数据库类型:" + connType); System.out.println("3.------->主机(IP):" + host); System.out.println("4.------->端口:" + port); System.out.println("5.------->用户名:" + userName); // 解密 //参考https://the-x.cn/cryptography/Aes.aspx AES aes = new AES("CBC", "PKCS7Padding", "libcckeylibcckey".getBytes(), "libcciv libcciv ".getBytes()); String val = aes.decryptStr(encryptPassword); System.out.println("6.------->密码:" + val); System.out.println("7.------->数据库名称:" + database); System.out.println("=============================================="); System.out.println(); System.out.println(); System.out.println(); System.out.println("================以下为全部连接信息================"); }); } } - 所需依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.3</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.68</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
风险提示
- 可能违反数据库安全策略
- 仅限合法授权场景使用
技术边界说明
- 所有操作需遵守数据安全法规
- 企业环境需获得正式授权
- 解密工具仅限合法恢复用途
扩展阅读方向
- MySQL 8.0密码策略强化机制
- 基于Vault的数据库密码动态管理
- Navicat连接配置加密原理分析
- 数据库账号最小权限分配原则
9万+

被折叠的 条评论
为什么被折叠?



