mysql 8.0 及以上版本支持动态权限,需确认版本并查询 mysql.dynamic_privileges 表;通过 GRANT 语句授予权限如 CONNECTION_ADMIN,并用 SHOW GRANTS 验证。

MySQL 从 8.0 版本开始引入了动态权限(Dynamic Privileges)机制,允许在不重启服务的情况下为用户授予或撤销某些高级权限,比如对特定角色或安全操作的控制。启用和使用动态权限不需要额外的配置开关,但需要确保你的 MySQL 环境满足相关条件并正确操作。
确认 MySQL 版本支持
动态权限是 MySQL 8.0 及以上版本的功能,首先确认你使用的 MySQL 版本:
SELECT VERSION();
如果你的版本低于 8.0,则无法使用动态权限功能,需升级到 8.0 或更高版本。
检查是否已启用角色和权限系统
动态权限依赖于角色(Roles)和增强的权限管理 架构。确保以下设置已启用:
- 系统变量
mysql_native_password_proxy_users通常不影响,但要确保使用的是原生密码插件或 caching_sha2_password。 - 确保 角色支持已开启:MySQL 8.0 默认开启角色功能,无需手动启用。
你可以通过以下命令查看当前支持的动态权限:
SELECT * FROM mysql.procs_priv WHERE proc_name = 'set_role';
更直接的方式是查询数据字典表(MySQL 8.0+):
SELECT * FROM mysql.dynamic_privileges;
这条语句会列出所有可用的动态权限名称及其描述,如 mysql_native_password_proxy_users、appLICATION_PASSWORD_ADMIN 等。
授予和使用动态权限
一旦确认环境支持,就可以像普通权限一样通过 GRANT 语句为用户或角色分配动态权限。
示例:授予用户 CONNECTION_ADMIN 权限(允许杀掉连接)
GRANT CONNECTION_ADMIN ON *.* TO 'admin_user'@'localhost';
示例:授予 APPLICATION_PASSWORD_ADMIN(用于管理应用密码)
GRANT APPLICATION_PASSWORD_ADMIN ON *.* TO 'app_admin'@'%';
执行后刷新权限:
FLUSH PRIVILEGES;
这些权限立即生效,无需重启 MySQL 服务,这就是“动态”的体现。
验证权限是否生效
可以登录对应用户,尝试执行受保护的操作,或查询该用户的有效权限:
SHOW GRANTS FOR 'admin_user'@'localhost';
也可以使用如下方式查看当前会话拥有的动态权限:
SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE '%admin_user%';
基本上就这些。只要 MySQL 版本达标,动态权限自动可用,关键是理解哪些操作对应哪些动态权限,并用标准 GRANT 语法授权即可。不复杂但容易忽略细节,比如主机名匹配或权限名称拼写。


