--skip-grant-tables使MySQL跳过权限表加载与校验,实现免验证直连;需配合--shared-memory(Windows)或正确配置监听(Linux),修改密码后必须执行FLUSH PRIVILEGES;并删除该参数重启服务。

mysql启动时加--skip-grant-tables到底起什么作用
它让mysqld进程完全不读取mysql.user表,也不校验任何用户名、密码、权限——相当于把整个权限系统关掉了。这不是“免密登录”,而是“绕过登录验证”。所以你用mysql -u root -p回车就能进,不是因为密码对,而是因为压根没检查。
注意:--skip-grant-tables必须配合--shared-memory(Windows)或确保mysqld能正常监听(Linux),否则服务起不来;单独加这个参数在NT类系统上会报错“TCP/IP, –shared-memory, or –named-pipe should be configured”。
MySQL 5.7 和 8.0+ 修改密码的SQL语句不能混用
5.7 仍保留password字段但已废弃,推荐用authentication_string;8.0+ 彻底移除password字段,只认authentication_string,且PASSWORD()函数在 8.0.11+ 已被标记为废弃。
- MySQL 5.7:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE user = 'root' AND host = 'localhost'; - MySQL 8.0+:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 无论哪个版本,执行完都必须跟一句
FLUSH PRIVILEGES;,否则新密码不会加载进内存,等于白改
改完密码后不清理配置或不重启,等于没修
常见错误是:在my.ini或my.cnf里加了skip-grant-tables,改完密码就直接退出 MySQL,忘了删这行、也没重启服务。结果下次启动还是免密直通——任何人连上你的库都能干任何事。
正确顺序是:
- 停止 MySQL 服务
- 删掉配置文件中
skip-grant-tables这一行 - 重启服务(不是 reload,是完整 stop → start)
- 用
mysql -u root -p输新密码验证;如果直接进了没提示输密码,说明skip-grant-tables还在生效
Windows 下必须用管理员身份运行 CMD 才能操作服务
非管理员 CMD 无法启动/停止 MySQL 服务,也常报错'mysql' 不是内部或外部命令——因为mysql.exe路径没进环境变量,而管理员 CMD 能直接调用mysqld二进制文件。
实操建议:
- 先用
net stop MySQL停服务(服务名以实际为准,可能是mysql80) - 编辑
my.ini时确认是[mysqld]段落下添加,不是[client]或[mysql] - 启动服务前检查端口:改完配置后
netstat -ano | findstr :3306,确保没其他进程占着
最易忽略的是FLUSH PRIVILEGES;和删配置项这两步,漏掉任一,密码就改不生效,或者留下严重安全隐患。


















