error 1290(hy000)本质是mysql在--skip-grant-tables模式下未加载授权表,故禁止执行create user、grant等所有权限管理语句;此时可登录但无法修改权限,因“没表可改”。

因为 --skip-grant-tables 会让 MySQL 完全关闭权限校验,所有连接无需密码、无身份验证、无操作限制——它不是“临时绕过”,而是整套安全机制的物理性下线。
为什么连 root 都不需要密码还能报 ERROR 1290?
ERROR 1290(HY000)本质是 MySQL 在拒绝执行“权限管理语句”,不是拒绝你登录。它清楚地告诉你:当前内存里根本没有加载 mysql.user、mysql.db 等授权表结构,所以 CREATE USER、ALTER USER、GRANT、REVOKE 全部失效。你看到的是“能进不能改”,实际是“没表可改”。
常见错误现象:
- 执行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new'报错 ERROR 1290,但UPDATE mysql.user SET authentication_string = ...却能成功 - 误以为
FLUSH PRIVILEGES能刷新权限——其实在 --skip-grant-tables 模式下,这条命令不触发任何权限重载逻辑
哪些操作看似安全实则埋雷?
很多人只改完密码就重启,却忽略几个关键动作:
- 没删掉配置文件里的
skip-grant-tables行,下次重启又自动进入裸奔状态 - 没检查是否存在空用户:
SELECT User, Host FROM mysql.user WHERE User = '',这类账号在跳过模式下可被任意利用 - 用
UPDATE mysql.user改密码时,没同步更新plugin字段(如 MySQL 8.0 的caching_sha2_password),导致重启后无法登录 - 没执行
FLUSH PRIVILEGES(虽然该命令在跳过模式下无效,但重启后首次加载权限表前必须运行一次,否则新写入的密码字段不会生效)
MySQL 8.0+ 下更隐蔽的风险点
MySQL 8.0 默认使用 caching_sha2_password 插件,而 --skip-grant-tables 启动后,mysql.user 表中 plugin 和 authentication_string 字段的格式要求更严格:
- 直接写明文密码或旧版
PASSWORD()函数结果会失败,必须用SHA2('pwd', 256)或官方推荐的ALTER USER ... IDENTIFIED WITH caching_sha2_password BY 'pwd'(但后者在跳过模式下不可用) - 如果用
mysqld --initialize-insecure重建权限表,它会生成空密码 root,但默认插件仍是caching_sha2_password,此时必须立刻用mysql -u root --skip-password登录并重设,否则后续连接会卡在认证协议不匹配 - 8.0 不再支持
password字段,改用authentication_string;若手动 UPDATE 时仍往password写值,该字段会被忽略,登录永远失败
真正危险的从来不是“怎么修密码”,而是修完之后没人确认 @@skip_grant_tables 是否为 OFF、mysql.user 里有没有残留的 ''@'localhost'、以及所有业务连接是否已切换到新密码+新认证插件。这些细节不落地,一次跳过授权表的操作,就等于给数据库装了一扇永远不锁的后门。











