必须先停掉mysqld进程并确认无残留,否则后续操作会失败或留后门;需同时终止mysqld和mysqld_safe进程,验证3306端口无监听,再以正确参数顺序启动并执行flush privileges两次。

能重置,但必须停服务、跳权限验证、改完立刻恢复——没这三步,不是失败就是留后门。
必须先停掉 mysqld 进程,且确认无残留
直接 systemctl stop mysql 或 service mysqld stop 不一定真停干净。Linux 下常有 mysqld_safe 和 mysqld 两个进程,后者是主服务,前者是守护进程;若只杀 mysqld,mysqld_safe 会立刻拉起新实例,导致后续 --skip-grant-tables 启动失败或端口冲突。
- 查进程:用
ps aux | grep mysqld,重点看是否有mysqld_safe和mysqld同时存在 - 杀进程:先
kill -9 <mysqld_safe_pid></mysqld_safe_pid>,再kill -9 <mysqld_pid></mysqld_pid>;或者统一用killall mysqld mysqld_safe - Windows 用户:进
services.msc停 MySQL 服务后,再打开任务管理器确认无mysqld.exe - 验证是否真停:
netstat -tlnp | grep :3306(Linux)或netstat -ano | findstr :3306(Windows),输出为空才安全
用 --skip-grant-tables 启动时,参数顺序和用户权限不能错
这不是加个参数就能连上的事。MySQL 8.0 起默认禁用远程 TCP 连接,但本地 socket 仍开放——所以你得确保启动命令能生成有效 socket 文件,否则 mysql -u root 会报 Can't connect to local MySQL server through socket。
- 必须用
mysqld直接启动,不要用mysqld_safe(它会忽略部分参数) - 参数顺序重要:
mysqld --skip-grant-tables --skip-networking --user=mysql——--user=mysql必须带上,否则可能因权限不足写不了/var/run/mysqld/mysqld.sock - 启动后终端会“卡住”,这是正常现象;别 Ctrl+C,新开一个终端执行
mysql -u root(不输密码直接回车) - Docker 环境慎用:容器内默认无 systemd,需改用
docker exec -it <container> mysqld --skip-grant-tables --user=mysql &</container>,并确保挂载了数据目录
改密码语句必须匹配版本,且必须 FLUSH PRIVILEGES
MySQL 5.7.6+ 和 8.0 的语法不可互换,抄错就报错;更关键的是,免认证模式下权限表未加载,很多操作会被拒绝,必须手动补一步初始化。
- 登录后第一件事不是改密码,而是先执行:
FLUSH PRIVILEGES;——否则后续ALTER USER会报错ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement - 改密语句(MySQL 5.7.6+ / 8.0+):
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 若报
ERROR 1819 (HY000):说明密码强度不够,临时执行SET GLOBAL validate_password.policy=LOW;再重试 - 若旧客户端连不上(报
caching_sha2_password插件错误):改用ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 改完务必再执行一次
FLUSH PRIVILEGES;,否则新密码不会生效
重启前必须清理 skip-grant-tables 痕迹
很多人改完密码就 systemctl start mysqld,结果发现还能无密码登录——因为配置文件里还留着 skip-grant-tables,或者后台还有残留 mysqld 进程在跑。
- 检查配置文件:
/etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf(Linux)或C:\my.ini(Windows),删掉所有含skip-grant-tables的行 - 确认无残留进程:
ps aux | grep mysqld或任务管理器里杀光mysqld.exe - 用原方式启动:
systemctl start mysqld或 Windows 服务管理器启动,再测试mysql -u root -p - 额外提醒:如果之前用过
--init-file,记得删掉对应 SQL 文件(如/root/reset_password.sql),避免被复用
最易被忽略的点是:FLUSH PRIVILEGES 在免认证模式下要执行两次——一次是让权限系统就位,一次是让新密码落地。少一次,整个流程就白做了。











