error 1290是因为mysql以--skip-grant-tables模式运行,禁用权限系统,导致create user、alter user等语句被拒绝;解决关键是先执行flush privileges激活临时权限上下文,再更新密码或建用户,最后停服并清除启动参数后重启。

为什么执行 CREATE USER 或 ALTER USER 会报 ERROR 1290
因为 MySQL 正在以跳过权限验证的方式运行,所有需要检查权限的语句(比如创建用户、授权、改密码)都会被拒绝。这不是连接失败,而是服务本身明确拒绝执行——它知道自己没加载 mysql.user 表,所以连“你有没有权限干这事”都不验了。
不改配置文件也能临时绕过报错的关键操作
很多教程让你先去删 my.cnf 里的 skip-grant-tables,但其实你可能根本找不到这个配置项——它常藏在启动命令里,或者由运维脚本注入。更直接的办法是进 MySQL 后立即刷新权限缓存:
-
FLUSH PRIVILEGES;必须先执行,否则后续语句全报 ERROR 1290 - MySQL 5.7 及以前用
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('xxx'); - MySQL 8.0+ 必须用
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';,PASSWORD()函数已移除 - 执行完改密或建用户后,再补一次
FLUSH PRIVILEGES;,确保内存中权限状态同步
重启前必须关掉 read_only 和 super_read_only
有些环境(尤其是主从架构或容器部署)在跳过权限表时会顺带开启只读模式,导致 FLUSH PRIVILEGES 都失败。进 MySQL 后先确认:
SHOW VARIABLES LIKE '%read_only%';
如果 read_only 或 super_read_only 是 ON,得手动关掉:
SET GLOBAL read_only = OFF;SET GLOBAL super_read_only = OFF;- 再执行
FLUSH PRIVILEGES;
真正退出 --skip-grant-tables 模式要两步走
很多人执行完改密就直接 exit,结果一重启还是 ERROR 1290——因为服务仍在用原参数启动。必须做这两件事:
- 查当前 MySQL 进程是否带
--skip-grant-tables:ps aux | grep mysqld,看启动命令里有没有这个参数 - 如果有,不是改
my.cnf就完事;要停服务:sudo systemctl stop mysql(或mysqld,依实际服务名) - 确认
/etc/my.cnf或/etc/mysql/my.cnf中没有残留的skip-grant-tables行(注意:它可能在[mysqld]块外,或被注释掉但未删除) - 再用
sudo systemctl start mysql启动,此时才真正退出该模式
最容易被忽略的是进程级参数覆盖配置文件——哪怕 my.cnf 里没写,启动脚本里加了 --skip-grant-tables,照样生效。











