--skip-grant-tables 无效主因是未被 mysqld 实际加载,需通过 ps aux 确认启动命令;MySQL 8.0+ 必须用 ALTER USER 配合 FLUSH PRIVILEGES 修改密码,且需指定 mysql_native_password 插件避免认证失败。

mysqld 启动时加 --skip-grant-tables 为什么没用
常见现象是:改完配置、重启服务,mysql -u root 还是报 Access denied,或者压根连不上。根本原因通常是 mysqld 没真正用上这个参数——要么被 systemd 服务文件覆盖,要么被 my.cnf 里其他配置干扰。
实操建议:
- 先确认 mysqld 实际启动命令:
ps aux | grep mysqld,看输出里有没有--skip-grant-tables - 不要直接改
/etc/my.cnf加skip-grant-tables,它在较新 MySQL(8.0+)中已被弃用,改了也无效;必须通过命令行参数传入 - systemd 环境下,得临时覆盖服务配置:
sudo systemctl edit mysql,新增[Service]段并写ExecStart=完整路径 +--skip-grant-tables --skip-networking -
--skip-networking必须同时加,否则远程连接可能绕过权限检查,造成安全风险
MySQL 8.0+ 重置 root 密码时 UPDATE user SET authentication_string=... 报错
错误信息通常是:ERROR 1054 (42S22): Unknown column 'password' in 'field list' 或 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。前者是因为字段名变了,后者是因为你忘了先 FLUSH PRIVILEGES。
实操建议:
- MySQL 5.7 用
password字段,8.0+ 改成authentication_string,且必须用ALTER USER,不能直接 UPDATE - 进入后第一件事不是改密码,而是执行
FLUSH PRIVILEGES,否则权限系统没加载,所有 DML 都被拒绝 - 正确操作顺序:
FLUSH PRIVILEGES;→ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; - 如果提示
'root'@'localhost'不存在,查SELECT User,Host FROM mysql.user;,有些安装默认是'root'@'127.0.0.1'或'root'@'%'
重置完密码重启 mysqld,mysql -u root -p 仍连不上
典型表现:输对密码也报 Access denied for user 'root'@'localhost'。问题往往出在认证插件不匹配,尤其是从旧版本升级或 Docker 镜像部署的实例。
实操建议:
- 检查当前 root 用户用的认证插件:
SELECT Host,User,plugin FROM mysql.user WHERE User='root'; - 如果 plugin 是
caching_sha2_password(MySQL 8.0 默认),而客户端不支持(比如老版 MySQL client 或某些 GUI 工具),就会连不上 - 解决方法是在重置密码时指定插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass'; - 或者临时在客户端加
--default-auth=mysql_native_password参数
跳过权限表后无法执行任何 SQL,提示 The MySQL server is running with the --skip-grant-tables option
这不是 bug,是 MySQL 的主动限制:启用 --skip-grant-tables 后,所有修改权限/用户/密码的语句(包括 CREATE USER、DROP USER、GRANT)都被禁用,只允许 FLUSH PRIVILEGES 和 ALTER USER(且需先 FLUSH)。
实操建议:
- 别试
UPDATE mysql.user或GRANT ALL ON *.*,一定失败 - 确保执行
ALTER USER前已运行FLUSH PRIVILEGES,否则会提示 “You must have the CREATE USER privilege” 这类误导性错误 - 改完密码后,务必移除
--skip-grant-tables并完整重启服务,不要只是KILL进程再手动启——否则权限系统不会重新加载
最常被忽略的是 FLUSH PRIVILEGES 这一步,很多人以为进了 MySQL 就能直接改,结果卡在权限语句报错里反复折腾。记住:跳过权限表 ≠ 权限系统失效,它只是换了一种加载方式。


















