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语法授权即可。不复杂但容易忽略细节,比如主机名匹配或权限名称拼写。


