如何撤销MySQL普通用户对performance_schema的访问权限并限制其查看系统表信息?
- 内容介绍
- 文章标签
- 相关推荐
本文共计722个文字,预计阅读时间需要3分钟。
MySQL 5.7 默认给予 USAGE 权限(即已创建但未授权任何权限的用户)对 performance_schema 的 SELECT 权限,这是历史兼容性设计,并非 bug。因此,无需担心。直接执行 CREATE USER 'u'@'%'; 创建的用户也能执行 SELECT * FROM performance_schema.events_statements_current;。
如何彻底收回 performance_schema 的 SELECT 权限?
必须显式用 REVOKE 剥离,且需注意作用域和生效时机:
- 对单个用户:执行
REVOKE SELECT ON performance_schema.* FROM 'username'@'host'; - 必须在
mysql系统库所在实例上执行(不能跨实例代理) - 执行后需运行
FLUSH PRIVILEGES;(仅当使用 GRANT/REVOKE 修改权限表时才强制需要;但为保险起见建议加上) - 该操作不影响
information_schema——它由 MySQL 服务层硬编码控制,无法通过权限系统禁用普通用户的SELECT
禁止查看所有系统库的更稳妥做法
仅 revoke performance_schema 不够,因为用户仍可访问 information_schema 中的表名、列名甚至部分统计信息(如 TABLES、COLUMNS)。
本文共计722个文字,预计阅读时间需要3分钟。
MySQL 5.7 默认给予 USAGE 权限(即已创建但未授权任何权限的用户)对 performance_schema 的 SELECT 权限,这是历史兼容性设计,并非 bug。因此,无需担心。直接执行 CREATE USER 'u'@'%'; 创建的用户也能执行 SELECT * FROM performance_schema.events_statements_current;。
如何彻底收回 performance_schema 的 SELECT 权限?
必须显式用 REVOKE 剥离,且需注意作用域和生效时机:
- 对单个用户:执行
REVOKE SELECT ON performance_schema.* FROM 'username'@'host'; - 必须在
mysql系统库所在实例上执行(不能跨实例代理) - 执行后需运行
FLUSH PRIVILEGES;(仅当使用 GRANT/REVOKE 修改权限表时才强制需要;但为保险起见建议加上) - 该操作不影响
information_schema——它由 MySQL 服务层硬编码控制,无法通过权限系统禁用普通用户的SELECT
禁止查看所有系统库的更稳妥做法
仅 revoke performance_schema 不够,因为用户仍可访问 information_schema 中的表名、列名甚至部分统计信息(如 TABLES、COLUMNS)。

