mysqld --skip-grant-tables 启动失败主因是参数未生效或被 systemd/windows 服务覆盖;须用 ps 确认进程含该参数,linux 手动启动并加 --skip-networking,mysql 5.7+ 需用 alter user 或 authentication_string 修改密码,且需 flush privileges 并逐条处理 root@host 多记录。

用 mysqld --skip-grant-tables 启动后连不上 MySQL
跳过权限表启动本身没问题,但常见失败原因是 mysqld 进程没真正用这个参数跑起来,或者被系统服务管理器(比如 systemd)自动覆盖了启动参数。
- 先确认进程是否真带了
--skip-grant-tables:运行ps aux | grep mysqld,找完整命令行里有没有这个参数 - 如果是用
systemctl start mysql启动的,直接加参数无效;得临时改 service 文件或用systemctl set-environment,更稳妥的是手动 kill 掉原进程,再用完整命令启动:sudo mysqld --skip-grant-tables --skip-networking --user=mysql -
--skip-networking建议加上,避免未授权远程连接;但这也意味着你只能本地mysql -u root连,不能加-h 127.0.0.1(会走 TCP,被拒绝)
连上后 UPDATE mysql.user 报错:Unknown column 'password' in 'field list'
MySQL 5.7.6+ 和 8.0+ 彻底移除了 password 字段,改用 authentication_string,而且密码修改方式也变了——不能再用 UPDATE 直接写哈希值。
- 5.7 中执行:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root'; - 8.0+ 必须用:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 注意
'root'@'localhost'要和你实际登录时匹配;如果之前是'root'@'%',这里就得换掉,否则重置完还是登不上 - 改完必须执行
FLUSH PRIVILEGES;,否则不生效
重置完重启 MySQL,又提示 Access denied for user 'root'@'localhost'
大概率是权限表没刷全,或者 root 用户有多个 host 记录,你只改了其中一条。
- 进库后查清楚到底有哪些 root:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 如果返回多行(比如
localhost、127.0.0.1、%),每条都得单独重置,尤其别漏掉127.0.0.1—— macOS 或某些 Linux 发行版默认用它解析 localhost - MySQL 8.0 默认认证插件是
caching_sha2_password,老客户端可能不兼容;重置时显式指定mysql_native_password更稳 - 重启前确保停干净所有 mysqld 进程,否则新配置不加载
Windows 下用 mysqld --skip-grant-tables 提示 The service already exists
Windows 服务注册机制会让命令行参数被忽略,直接报错或静默失败。
- 先以管理员身份运行 CMD,停服务:
net stop mysql(服务名可能是mysql80等,用sc queryex type= service state= all | findstr mysql查) - 不要用
net start,而是进 MySQL 的bin目录,运行:mysqld --skip-grant-tables --shared-memory --console(--console能看到实时日志,方便判断是否卡住) - 另一个坑:Windows 下
my.ini里如果有skip-grant-tables没注释,会导致每次启动都跳权限,必须手动删掉再重启服务
localhost 和 127.0.0.1 在不同版本里行为还不一样,得挨个试。










