前言
网上关于“MySQL密码正确却无法登录”的解决方案很多,比如跳过权限验证、重置 root 密码、检查插件认证方式等。但在我遇到的问题中,这些方法都不适用——因为根本不是密码错了,而是连错了实例。
这里记录一下我的“乌龙”经历,希望能帮到踩了同样坑的朋友。
正文
情况描述
我在本地安装并配置好 MySQL 后,成功设置了 root 密码,并正常使用了一段时间。
但第二天再次尝试登录时,执行:
1 | mysql -u root -p |
却出现
1 | ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) |
于是按照网上的教程重置了密码,登录就成功了,我便没有深究。
然而,当我为了修改数据库默认编码(utf8mb4)而编辑 my.ini 文件并重启 MySQL 后,发现之前创建的数据库和表全都不见了!
病因分析
经过反复排查,终于发现问题根源:
我之前退出 MySQL 客户端时,直接关闭了命令行窗口,没有输入 exit 或 \q 正常退出。
第二天执行 mysql -u root -p 时,系统自动启动了一个新的、干净的 MySQL 实例(或连接到了另一个实例),而这个实例的 root 用户密码是空的(或默认值),和我之前配置的实例不是同一个!
更具体地说:
我本地可能同时存在两个 MySQL 服务
解决办法
1. 确认当前连接的是哪个 MySQL 实例
登录后执行:
1 | SHOW VARIABLES LIKE 'datadir'; |
查看数据目录。对比你之前配置的 my.ini 中的 datadir 路径是否一致。
2. 检查 MySQL 服务状态
在 Windows 上:
1 | sc query mysql |
看是否有多个 MySQL 服务在运行(如 MySQL80、MySQL 等)。
在 Linux/macOS 上:
1 | ps aux | grep mysqld |
3. 确保只启动一个 MySQL 服务
停止所有 MySQL 进程(把不是你需要的服务删除了),然后手动启动你配置过的那个实例:
Windows(以管理员身份)
1 | net stop MySQL80 |
4. 使用明确的连接方式
如果你有多个实例,建议通过指定端口或 socket 连接:
1 | mysql -u root -p -P 3306 --protocol=tcp |
5. 避免“直接关窗口”
虽然直接关闭命令行通常不会导致数据丢失,
但介于我糟心的体验,还是建议养成输入 exit 退出的习惯。
bb
如果所有方法试过之后都不好用,重装可以解决你的一切烦恼(记得备份数据)。