必须先停止mysql服务并以--skip-grant-tables方式启动,再免密登录修改authentication_string字段并执行flush privileges,最后终止跳过权限进程并正常重启服务。

必须停掉 MySQL 服务,再用 mysqld --skip-grant-tables 启动,否则根本进不去;改完密码后不执行 FLUSH PRIVILEGES,新密码就无效。
停服务 + 跳过权限启动(Linux/macOS)
先确认服务名,常见是 mysqld 或 mysql:
-
sudo systemctl stop mysqld(CentOS/RHEL) -
sudo service mysql stop(Ubuntu/Debian)
然后用跳过权限方式启动:
sudo mysqld --skip-grant-tables --skip-networking &-
--skip-networking很关键:防止其他机器连上来绕过认证 - 该命令会后台运行,终端返回后即可进行下一步
免密登录并修改密码(MySQL 5.7)
新开终端,直接连接:
-
mysql -u root(不加-p,也不输密码) - 进库后立刻执行:
USE mysql; - 更新密码字段(注意字段名和条件):
UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost'; - MySQL 5.7 不再用
password字段,用错会报Unknown column 'password' in 'field list' - 必须执行:
FLUSH PRIVILEGES;,否则密码写进表也没用
退出并恢复正常启动
改完别急着重启服务——先关掉那个 mysqld --skip-grant-tables 进程:
- 查进程:
ps aux | grep "skip-grant-tables" - 杀掉它:
sudo kill $(pgrep -f "mysqld.*skip-grant-tables") - 再用常规方式启动:
sudo systemctl start mysqld - 验证:
mysql -u root -p,输入新密码,能进就是成功
最容易漏的是没关掉 --skip-grant-tables 进程,导致 3306 端口被占、正常服务起不来,或者误以为改好了但其实还在免密状态。











