mysql 8.0+中仅授予process权限无法执行kill connection,因process仅允许查看自身线程(show processlist),终止连接需connection_admin权限;二者职能分离,“看”与“杀”权限不可替代。

为什么只给 PROCESS 权限无法 KILL 连接
执行 KILL CONNECTION 123 报错 ERROR 1227 (42000): Access denied; you need (at least one of) the CONNECTION_ADMIN privilege(s) for this operation,说明权限不足。MySQL 8.0+ 中,PROCESS 仅允许查看线程(如 SHOW PROCESSLIST),不包含终止能力。必须搭配 CONNECTION_ADMIN 才能执行 KILL 操作。
-
PROCESS是“看”的权限,CONNECTION_ADMIN是“杀”的权限,二者缺一不可 - 旧版本(SUPER 替代,但该权限在 8.0+ 已被拆分,继续授予会触发警告甚至被拒绝
- 即使用户有
PROCESS,若没CONNECTION_ADMIN,KILL命令直接被拦截,不进权限校验第二步
正确授予 CONNECTION_ADMIN 的语法和范围
全局权限只能作用于 *.*,不能限定到库或表。错误写法如 GRANT CONNECTION_ADMIN ON mydb.* TO 'monitor'@'%' 会报语法错误。
- 标准授权语句:
GRANT CONNECTION_ADMIN ON *.* TO 'monitor'@'%' - 如果还需查看线程列表,补上
PROCESS:GRANT PROCESS, CONNECTION_ADMIN ON *.* TO 'monitor'@'%' - 授权后必须执行
FLUSH PRIVILEGES—— 虽然多数情况下自动加载,但生产环境别依赖“通常” - 避免用
GRANT ALL PRIVILEGES ON *.*代替,它隐式包含已废弃权限(如FILE、SHUTDOWN),且违反最小权限原则
监控脚本中调用 KILL 的常见陷阱
很多慢查询自动终止脚本在执行 KILL CONNECTION 前,先查 information_schema.PROCESSLIST 或 sys.session 获取 ID,但容易忽略权限边界。
- 用户必须对
performance_schema或information_schema有 SELECT 权限,否则查不到线程信息 ——PROCESS权限本身不赋予读取这些库的权限 - 脚本里硬编码
KILL CONNECTION @id时,若@id来自非可信来源(如 Web 表单输入),可能引发 SQL 注入或误杀系统线程;建议加白名单过滤(如排除USER = 'system user'或ID ) - MySQL 8.0+ 默认启用
SYSTEM_USER权限保护,即使有CONNECTION_ADMIN,也无法KILL系统线程(如复制 IO/SQL 线程),这是设计行为,不是权限遗漏
MariaDB 用户注意权限语义差异
如果你在 MariaDB 上复用 MySQL 的授权语句,CONNECTION_ADMIN 不存在 —— MariaDB 仍使用 SUPER 或 CONNECTION_CONTROL_ADMIN(取决于版本),且 SUPER 在 MariaDB 中语义更宽泛,不等价于 MySQL 的 CONNECTION_ADMIN + PROCESS。
- MariaDB 10.4+ 推荐用:
GRANT CONNECTION_CONTROL_ADMIN ON *.* TO 'monitor'@'%'(控制连接数)+PROCESS(查看线程) - 跨数据库迁移权限配置前,务必检查目标版本手册,
SUPER在 MariaDB 中可杀连接,但在 MySQL 8.0+ 中已被移除对该操作的支持 - 权限名大小写敏感,
connection_admin(小写)会报错,必须全大写
实际执行时最易被跳过的一步是 FLUSH PRIVILEGES,尤其在自动化部署脚本中漏掉这句,会导致权限看似授了却始终不生效——这不是缓存延迟,而是权限表未重载。











