MySQL密码忘了,密码忘别急着卸载重装。密码忘数据还在,密码忘只是密码忘进不去门而已。我见过太多人一慌就删库跑路,密码忘其实有更体面的密码忘解法。
核心思路就一条:绕过认证,密码忘临时改掉密码。密码忘MySQL的密码忘认证机制在启动时可以通过参数跳过,这给了我们一条后路。密码忘
方法一:skip-grant-tables(最常用)
先停掉MySQL服务。密码忘在Linux上执行service mysql stop,密码忘Windows下在“服务”里停掉,密码忘或者net stop mysql。密码忘然后手动启动它,密码忘加上跳过权限表的参数:
mysqld --skip-grant-tables & 注意,这一步要确保没有其他MySQL进程在跑。启动后,直接无密码登录:
mysql -u root 进去了。这时候别急着改密码,先刷新权限让认证模块生效:
FLUSH PRIVILEGES; 然后换掉root密码。MySQL 5.7+和8.0的语法不同,5.7用:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码'); 8.0用:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; 改完退出,重启MySQL服务,用新密码登录即可。
方法二:初始化参数文件(更优雅)
如果你不想敲命令行,可以在配置文件my.cnf或my.ini里加一行:
[mysqld] skip-grant-tables 然后正常重启服务。登录后按上面步骤改密码,改完记得把这一行删掉,再重启。否则你的数据库会一直裸奔,任何人都能无密码进。
几个坑,踩过才知道
第一,用skip-grant-tables启动时,FLUSH PRIVILEGES必须执行,不然SET PASSWORD会报错。第二,如果你用的是MySQL 8.0,默认认证插件是caching_sha2_password,老语法会失效。第三,改完密码后,别急着测试,先确认服务是正常模式重启的,否则你连不上还以为是密码错了。
有一次,帮朋友处理他公司的服务器,他试了网上各种“秘籍”都不行,最后发现是配置文件里残留了旧的skip-grant-tables没删,导致每次重启都在跳过认证。删掉那行,世界清净了。
还有更狠的情况——如果你连root用户都被删了,或者权限表整个坏了,那就得用--skip-grant-tables进去后重建用户。不过这种场景很少见,大部分时候只是密码遗忘。
最后说句实在话,密码忘了不可怕,可怕的是没备份。趁现在能进去,赶紧导出一份数据:
mysqldump -u root -p --all-databases > backup.sql 存到安全的地方。下次再忘,直接恢复,连改密码都省了。
别问我为什么知道这么多,都是血泪换来的。
