SYSTEM_USER权限仅控制对用户账户本身的管理操作,如CREATE/ALTER/DROP USER、GRANT/REVOKE权限、修改密码及认证属性等,不涉及数据访问;它强制要求操作者自身必须拥有该权限才能修改其他系统账号(包括root),是MySQL 8.0.16起实现账户分层保护的核心机制。

SYSTEM_USER权限到底控制什么操作?
它不负责查数据、建表或执行SQL,只管“谁可以改谁”——具体来说,是限制对用户账户本身的管理行为。没有它,哪怕你有CREATE USER或GRANT OPTION,也不能修改已拥有SYSTEM_USER权限的账号(包括root自己)。这是MySQL 8.0.16起引入的账户分层保护机制。
常见被它拦住的操作包括:
- DROP USER 'xxx'@'%'(报错ERROR 1227 (42000))
- REVOKE ALL PRIVILEGES ON *.* FROM 'xxx'@'%'
- 修改密码、认证插件、密码过期策略等ALTER USER语句
- 对其他系统账号执行GRANT/REVOKE
给用户加SYSTEM_USER权限的实操要点
直接用GRANT SYSTEM_USER ON *.* TO 'user'@'host'就行,但要注意几个硬性前提:
- 执行授权的账号本身必须已有
SYSTEM_USER权限(否则会报错Access denied) - 目标用户不能是
mysql.sys这类内置系统账号(它们天生带该权限,不可显式授予) -
FLUSH PRIVILEGES不是必须的——MySQL 8.0+权限变更立即生效
例如,想让admin能管理所有账号:
GRANT SYSTEM_USER ON *.* TO 'admin'@'%';
如果当前用的是root但没SYSTEM_USER(常见于旧版本升级后),先补上:
使用 Kadence 主题作为 WordPress 项目的设计系统,涵盖设计令牌、布局系统、页头/页脚/导航设置以及页面/归档/单篇文章模板。
GRANT SYSTEM_USER ON *.* TO 'root'@'%';
为什么grant all privileges会自动带上SYSTEM_USER?
MySQL 8.0.16+中,GRANT ALL PRIVILEGES ON *.*不再只是“所有操作权限”,它隐式包含SYSTEM_USER——这是设计使然,不是bug。所以你用root创建一个全权用户后,root反而可能删不掉它,因为root自己缺这个权限。
验证方式:
SHOW GRANTS FOR 'new_user'@'%';
如果输出里含SYSTEM_USER,就说明已被授予。此时若要回收,必须用另一个已有SYSTEM_USER权限的账号执行REVOKE SYSTEM_USER ON *.* FROM ...,再撤其它权限。
SYSTEM_USER和普通管理员权限的关键区别
一个只有CREATE USER和GRANT OPTION的账号,能创建/删改普通用户,但无法碰任何带SYSTEM_USER的账号(包括自己被授了该权限后,别人也动不了它)。这种隔离是硬编码在权限检查逻辑里的,绕不开。
容易忽略的点:
- KILL会话也受此影响:杀一个SYSTEM_USER账号持有的连接,执行KILL的账号也得有SYSTEM_USER(或CONNECTION_ADMIN)
- 修改存储过程DEFINER为系统账号时,调用者需有SYSTEM_USER
- 它和SUPER权限无替代关系,两者可共存,但作用域完全不同

















