MySQL 5.6无root用户却能登录,如何重置root密码?
为什么无root账号仍能以
root登录? 这事儿我之前帮朋友排查过,其实原因很简单:当你用mysqld_safe --skip-grant-tables启动MySQL时,它会直接跳过权限验证逻辑——也就是说,MySQL根本不会去查mysql.user表确认用户名是否存在、有没有登录权限。不管你输入什么用户名(哪怕是完全不存在的),甚至直接敲mysql不指定用户名,都能直接进入数据库。这个参数就是专门为权限表损坏、丢失或者忘记密码这类场景设计的,让你能强行进入数据库修复问题。
如何重置MySQL 5.6的root密码(并恢复root账号)
既然你的mysql.user表里没有root账号,那我们得先创建账号再设置密码,一步步来:
- 保持当前已经登录的
mysql客户端窗口打开,先切换到系统核心数据库:
USE mysql;
- 创建本地登录的root账号并设置密码(把
your_new_password换成你自己的密码):
CREATE USER 'root'@'localhost' IDENTIFIED BY 'your_new_password';
如果需要允许root远程登录(生产环境不建议随便开,谨慎使用),可以额外执行这条:
CREATE USER 'root'@'%' IDENTIFIED BY 'your_new_password';
- 给root账号授予所有权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
如果创建了远程root账号,对应执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
- 手动刷新权限(因为当前是跳过权限表启动的,必须手动刷新才能让新的权限配置生效):
FLUSH PRIVILEGES;
- 退出MySQL客户端:
EXIT;
停止之前用
mysqld_safe --skip-grant-tables启动的MySQL进程:- 如果是在终端直接启动的,按
Ctrl+C即可终止; - 也可以用命令终止进程:
pkill mysqld_safe pkill mysqld
- 如果是在终端直接启动的,按
正常启动MySQL服务:
service mysql start
- 用新密码测试登录:
mysql -u root -p
输入你刚才设置的密码,就能正常登录了。
额外小提醒
- 如果执行
CREATE USER时提示账号已存在,说明你之前的查询没查全——user表的主键是User+Host,可能root账号存在于其他主机(比如root@127.0.0.1),可以用这条命令查看所有用户:SELECT User, Host FROM mysql.user; --skip-grant-tables模式下数据库完全开放,处理完后一定要立即恢复正常启动,避免安全风险。
内容的提问来源于stack exchange,提问作者all_techie
相关产品推荐
相关产品推荐

