error 1290 表明 mysql 以 --skip-grant-tables 启动,权限系统被禁用;此时 flush privileges 无效,须检查并删除配置文件或服务文件中的 skip-grant-tables,重启 mysqld 进程方可生效。

执行 FLUSH PRIVILEGES 后仍报 ERROR 1290 怎么办
不是所有场景下 FLUSH PRIVILEGES 都能立刻解除限制——它只在权限系统已加载、但内存缓存未更新时有效。如果 MySQL 是以 --skip-grant-tables 启动(比如通过配置文件写死或命令行显式指定),权限表根本没被读入,此时 FLUSH PRIVILEGES 只会返回成功,但后续 ALTER USER 或 GRANT 依然报错。
关键判断点:执行 SELECT @@skip_grant_tables;,若返回 1,说明跳过权限是全局生效的,FLUSH PRIVILEGES 无法绕过这个启动态。
- 检查配置文件:
/etc/my.cnf或/etc/mysql/my.cnf的[mysqld]段,删掉skip-grant-tables行 - 检查 systemd 服务文件:
systemctl cat mysql或cat /usr/lib/systemd/system/mysqld.service,确认ExecStart是否硬编码了--skip-grant-tables - 重启前务必先
systemctl daemon-reload,否则配置修改不生效
为什么 FLUSH PRIVILEGES 有时管用,有时不管用
FLUSH PRIVILEGES 的作用是强制从磁盘重新加载权限表到内存,但它不改变 MySQL 启动时是否启用 --skip-grant-tables 这个开关。只有当 MySQL 正常启动(即没跳过权限表)、但你手动改过 mysql.user 表后,才需要它来同步内存状态。
- 正常启动 → 直接执行
ALTER USER即可,无需FLUSH PRIVILEGES -
--skip-grant-tables启动 →FLUSH PRIVILEGES不触发权限表加载,只是清空已有缓存 - 想在跳过模式下改密码?只能走 DML:
UPDATE mysql.user SET authentication_string = PASSWORD('xxx') WHERE User='root' AND Host='localhost';,之后再FLUSH PRIVILEGES
MySQL 5.7 和 8.0 修改密码时的兼容性差异
即使绕过了 --skip-grant-tables 限制,不同版本对密码字段和函数的支持也不同,直接套用语句会失败。
- MySQL 5.7:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');(PASSWORD()函数可用) - MySQL 8.0+:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';(PASSWORD()已移除,必须用ALTER USER) - 注意:8.0 中
authentication_string字段存储的是哈希值,不能直接UPDATE明文;5.7 可用UPDATE ... SET password=PASSWORD('xxx')(旧字段名是password)
执行完修改后忘记重启服务的风险
很多人执行完 FLUSH PRIVILEGES 就以为完事了,结果发现新密码/权限不生效。这是因为 --skip-grant-tables 是进程级参数,只要 mysqld 进程没重启,它就一直生效,无论你刷多少次权限。
- 必须执行
systemctl restart mysqld(或service mysql restart)才能真正退出跳过模式 - 重启前建议先
mysqladmin ping确认服务已停止,避免“假重启” - 重启后立即验证:
mysql -u root -p输入新密码,再查SELECT user,host,authentication_string FROM mysql.user WHERE user='root';
--skip-grant-tables 是启动参数,不是运行时开关;FLUSH PRIVILEGES 不是万能钥匙,它只负责刷新,不负责加载**。











