mysqld --skip-grant-tables 启动后连不上,根本原因是未停止旧服务、未新开终端、未加--skip-networking;必须先彻底停服并杀净残留进程,再用完整路径启动带--skip-networking的新实例,登录后须用alter user修改密码并执行flush privileges,且注意root@host多记录匹配。

mysqld --skip-grant-tables 启动后连不上?不是命令错了,是没停旧服务、没开新终端、也没加 --skip-networking —— 这三步缺一不可。
为什么 mysqld --skip-grant-tables 没反应或直接退出
常见现象:执行完命令后 shell 没返回,或者进程秒退。根本原因是 MySQL 实例已在运行,而 --skip-grant-tables 只对**全新启动的 mysqld 进程**生效,不能附加到已有服务上。
- 先彻底停服务:
sudo systemctl stop mysqld(CentOS/RHEL)或sudo systemctl stop mysql(Ubuntu/Debian) - 确认无残留进程:
ps aux | grep mysqld,把非 root 的mysqld进程全kill -9掉 - 用完整路径启动(避免环境变量干扰):
/usr/sbin/mysqld --skip-grant-tables --skip-networking & -
--skip-networking必须加,否则远程连接可绕过认证,构成安全风险
登录后执行 UPDATE mysql.user SET authentication_string = ... 报错
MySQL 5.7+ 已移除 password 字段,且 authentication_string 不接受裸字符串赋值——直接 UPDATE 会触发字段不存在、空值校验或插件不匹配等错误。
- 不要用
UPDATE mysql.user SET password = PASSWORD('xxx')(5.7+ 字段已删) - 也不要写
UPDATE mysql.user SET authentication_string = 'xxx'(明文字符串不被插件认可) - 正确做法是用
ALTER USER,它自动适配当前认证插件:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 如果提示用户不存在,先查真实记录:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';,常见还有'root'@'127.0.0.1'或'root'@'::1'
重置后仍提示 Access denied for user 'root'@'localhost'
不是密码没改成功,而是权限没刷进内存,或客户端不兼容当前认证插件。
-
FLUSH PRIVILEGES;必须执行,漏掉这句,磁盘上的修改不会加载到运行时权限缓存中 - 检查插件是否兼容:
SELECT plugin FROM mysql.user WHERE User='root' AND Host='localhost'; - 若返回
caching_sha2_password但客户端太老(如旧版 Workbench、Sequel Pro),就切回兼容模式:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 确保你连接时用的是匹配的
Host:socket 连接默认解析为localhost,不是127.0.0.1,两者权限记录独立
重启服务后密码又失效或始终免密可登录
大概率是配置文件里还留着 skip_grant_tables=1,或者没杀干净前台 mysqld 进程就直接 systemctl start 了。
- 检查
/etc/my.cnf或/etc/mysql/my.cnf,确认[mysqld]段下没有skip_grant_tables行;Windows 下查C:\ProgramData\MySQL\MySQL Server X.X\my.ini - 删掉或注释该行后,必须再执行一次
systemctl restart mysqld(或net start mysql) - 别忘了关掉之前手动启动的后台
mysqld进程:killall mysqld或pgrep mysqld | xargs kill -9 - 生产环境务必验证:用新密码登录、执行
SHOW DATABASES;,确认权限完整
FLUSH PRIVILEGES 的强制性,以及 Host 匹配的隐式规则——很多人改了 'root'@'localhost' 却用 mysql -h 127.0.0.1 -u root -p 连,结果连的是另一个无权限的账户。











