GRANT 后无需执行 FLUSH PRIVILEGES,因其已原子性同步磁盘与内存权限;仅在直接修改系统表后才需使用,但 MySQL 8.0+ 中风险极高。

不需要,GRANT 后执行 FLUSH PRIVILEGES 不仅不必须,而且是错误操作习惯。
GRANT 本身已同步磁盘与内存权限
MySQL 5.7.6 起(8.0+ 更彻底),GRANT、REVOKE、CREATE USER、ALTER USER 等语句在执行时,会原子性完成两件事:
- 写入磁盘:更新
mysql.user、mysql.db等系统表 - 刷新内存:同步修改 ACL 内存结构(如
acl_users数组中的权限位)
这意味着命令成功返回后,新连接立刻能使用新权限。加 FLUSH PRIVILEGES 不但没效果,还可能掩盖问题——比如你误以为“加了才生效”,却忽略了真正卡点:host 不匹配、连接未重建、认证插件不兼容。
什么情况下真得用 FLUSH PRIVILEGES
仅当你绕过 SQL 授权逻辑、直接修改系统表时才需要它:
UPDATE mysql.user SET authentication_string = ... WHERE User='u';INSERT INTO mysql.db (Host, Db, User, Select_priv) VALUES ('%', 'test', 'u', 'Y');- 用
mysqldump导入旧版权限表备份后
此时 MySQL 完全不知情,内存 ACL 仍是旧快照,FLUSH PRIVILEGES 是唯一通知它“请全量重载磁盘数据”的方式。但注意:MySQL 8.0+ 中手动改 mysql.user 极易出错(如 authentication_string 格式、plugin 字段不一致),FLUSH PRIVILEGES 可能加载坏数据,导致 root 都登不上。
权限不生效?先检查这些真实原因
执行 GRANT 后仍报 Access denied,大概率不是缓存问题:
- 当前连接不会动态更新全局权限(
*.*),必须QUIT后重连;数据库级(db.*)需USE db才生效;表级权限则下次访问即检查 -
'u'@'localhost'和'u'@'127.0.0.1'是两个完全不同的用户,授权和连接 host 必须严格一致 - MySQL 8.0+ 默认用
caching_sha2_password插件,老客户端(如旧版 Navicat、MySQLdb)可能静默降级失败:能连上,但权限校验被跳过 - 托管环境(阿里云 RDS、腾讯云 CDB)通常禁用
FLUSH PRIVILEGES,直接报ERROR 1227 (42501) - MySQL 启动时加了
--skip-grant-tables,所有权限检查失效,FLUSH PRIVILEGES完全无意义
验证权限是否真生效的正确姿势
别只信 SHOW GRANTS FOR 'u'@'h' 返回结果,那只是查磁盘表快照:
- 新开终端,用新密码尝试登录:
mysql -u u -p -h host - 在新连接中执行实际语句:
SELECT * FROM db.t1;或USE db; - 用
CURRENT_USER()确认你连上的到底是哪个'user'@'host'条目(注意空格、大小写、通配符)
最常被忽略的一点:权限粒度不同,生效时机完全不同。把 FLUSH PRIVILEGES 当万能解药,反而会让你跳过这些关键验证步骤。


















