必须先停止正在运行的mysqld进程并清除残留,再用完整路径启动带--skip-grant-tables和--skip-networking的新实例;5.7用update+password(),8.0+须用alter user指定插件并执行flush privileges。

必须先停掉正在运行的 mysqld 进程,再用 --skip-grant-tables 启动全新实例——否则命令无效、客户端仍报 Access denied。
为什么 mysqld --skip-grant-tables 没反应?
根本原因不是命令写错,而是 MySQL 实例已在后台运行。--skip-grant-tables 只对**全新启动的 mysqld 进程**生效,不能附加到已有服务上。
- Linux:执行
sudo systemctl stop mysqld(注意不是mysql),再用ps aux | grep mysqld确认无残留进程;如有,kill -9掉非 root 的 mysqld 进程 - Windows:以管理员身份运行 CMD,执行
net stop mysql(服务名可能是mysqld或自定义名),再打开任务管理器,结束所有mysqld.exe - 启动时务必加
--skip-networking:防止远程未授权访问,例如sudo mysqld --skip-grant-tables --skip-networking &
登录后改密码要分版本写 SQL
MySQL 5.7 和 8.0+ 的密码字段、函数、认证插件完全不同,混用会导致静默失败或后续连接异常。
- MySQL 5.7:
USE mysql;后执行UPDATE user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost'; - MySQL 8.0+:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123';(PASSWORD()函数已废弃) - 如果重置后客户端报 “Client does not support authentication protocol”,说明插件不兼容,需显式指定:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass123'; -
FLUSH PRIVILEGES;必须执行,否则新密码不生效——这是最容易漏的一步
改完密码必须清理跳过模式
跳过权限校验只是临时手段,长期开着等于裸奔。不清理就重启,下次启动依然免密。
- 如果是命令行启动的:
killall mysqld(Linux/macOS)或直接关闭 Windows 中运行mysqld --skip-grant-tables的 CMD 窗口 - 如果是改了配置文件(如
/etc/my.cnf或my.ini):必须删除或注释掉skip_grant_tables=1这一行,再systemctl start mysqld或net start mysql - 验证是否恢复:用
mysql -u root -p登录,输新密码——如果没提示输密码就进去了,说明skip-grant-tables还在生效
host 匹配错误是另一个隐蔽坑:你改的是 'root'@'localhost',但用 mysql -u root -h 127.0.0.1 登录,就会失败——这两个是不同账户,得分别处理或统一用 localhost。











