MySQL执行GRANT后,为何需FLUSH_操作以同步内存缓存与磁盘表数据?
- 内容介绍
- 文章标签
- 相关推荐
本文共计914个文字,预计阅读时间需要4分钟。
plaintextGRANT 后面不需要 FLUSH PRIVILEGES——这是一个流传甚广的错误理解,执行它不仅没有用,还可能引发实际问题。
GRANT 语句本身就会同步内存与磁盘
MySQL 的 GRANT、REVOKE、CREATE USER 等权限管理语句,在内部实现上会同时完成两件事:写入磁盘的 mysql.user(或 mysql.db 等)表,以及更新内存中的权限结构(如 acl_users 数组)。这意味着权限变更在语句返回成功后就已生效,无需额外触发刷新。
常见误操作:
- 写了
GRANT SELECT ON mydb.* TO 'u'@'localhost',又顺手加一行FLUSH PRIVILEGES→ 多余,且容易让你误以为“不加就不生效” - 执行完
GRANT仍连不上 → 实际可能是 host 不匹配(比如用了'u'@'localhost'却从 127.0.0.1 连),或没重连已有连接
FLUSH PRIVILEGES 只在直接改系统表时才必要
FLUSH PRIVILEGES 的唯一合法用途,是当你绕过 SQL 接口、直接用 UPDATE mysql.user 或 INSERT INTO mysql.db 修改权限表之后。此时 MySQL 完全不知情,内存缓存仍是旧快照,必须靠 FLUSH PRIVILEGES 强制全量重载磁盘数据。
本文共计914个文字,预计阅读时间需要4分钟。
plaintextGRANT 后面不需要 FLUSH PRIVILEGES——这是一个流传甚广的错误理解,执行它不仅没有用,还可能引发实际问题。
GRANT 语句本身就会同步内存与磁盘
MySQL 的 GRANT、REVOKE、CREATE USER 等权限管理语句,在内部实现上会同时完成两件事:写入磁盘的 mysql.user(或 mysql.db 等)表,以及更新内存中的权限结构(如 acl_users 数组)。这意味着权限变更在语句返回成功后就已生效,无需额外触发刷新。
常见误操作:
- 写了
GRANT SELECT ON mydb.* TO 'u'@'localhost',又顺手加一行FLUSH PRIVILEGES→ 多余,且容易让你误以为“不加就不生效” - 执行完
GRANT仍连不上 → 实际可能是 host 不匹配(比如用了'u'@'localhost'却从 127.0.0.1 连),或没重连已有连接
FLUSH PRIVILEGES 只在直接改系统表时才必要
FLUSH PRIVILEGES 的唯一合法用途,是当你绕过 SQL 接口、直接用 UPDATE mysql.user 或 INSERT INTO mysql.db 修改权限表之后。此时 MySQL 完全不知情,内存缓存仍是旧快照,必须靠 FLUSH PRIVILEGES 强制全量重载磁盘数据。

