不能。MySQL 8.0默认禁止非root用户执行GRANT,即使拥有ALL PRIVILEGES,也必须显式授予GRANT OPTION、CREATE USER及mysql.user表的INSERT/UPDATE权限,并注意版本兼容性与安全限制。

非root用户能否直接执行GRANT?
不能。MySQL 8.0 默认禁止非root用户(哪怕有ALL PRIVILEGES)执行GRANT,除非显式授予GRANT OPTION权限——但仅此还不够。关键限制在于:GRANT OPTION只允许转发**自己已拥有的权限**,且不能跨层级越权(比如你只有SELECT,就不能用GRANT给别人加DROP)。更隐蔽的坑是:即使你被授予了GRANT OPTION ON *.*,仍无法创建新用户或修改其他用户的认证插件(如mysql_native_password),这些操作需要CREATE USER或INSERT到mysql.user表的权限,而后者在8.0中默认仅对root开放。
如何让非root用户具备子账号管理能力?
必须组合授予三项权限,并注意作用域:
-
GRANT OPTION:允许转发已有权限(必需) -
CREATE USER:才能执行CREATE USER语句(否则Access denied) -
INSERT和UPDATEonmysql.user:才能修改其他用户的密码、过期策略等(仅授GRANT OPTION不够)
实操命令示例(以dba_admin账号为例):
GRANT CREATE USER ON *.* TO 'dba_admin'@'%'; GRANT INSERT, UPDATE ON mysql.user TO 'dba_admin'@'%'; GRANT SELECT, INSERT, UPDATE ON mysql.db TO 'dba_admin'@'%'; GRANT GRANT OPTION ON myapp_db.* TO 'dba_admin'@'%'; FLUSH PRIVILEGES;
⚠️ 注意:mysql.user表的INSERT/UPDATE权限极其敏感,应严格限制主机范围(如'%' → '192.168.10.%'),且避免授予DELETE或DROP。
为什么用角色比直接授权更安全?
因为角色能隔离权限定义与用户绑定。你可以先创建一个管理角色:
CREATE ROLE 'subadmin_role'; GRANT CREATE USER, INSERT, UPDATE ON mysql.user TO 'subadmin_role'; GRANT GRANT OPTION ON myapp_db.* TO 'subadmin_role';
再把角色赋予具体用户:
GRANT 'subadmin_role' TO 'dba_admin'@'192.168.10.%'; SET DEFAULT ROLE 'subadmin_role' TO 'dba_admin'@'192.168.10.%';
好处是:权限变更只需改角色,不用逐个用户GRANT;审计时SHOW GRANTS FOR 'subadmin_role'一眼看清能力边界;且角色本身不带密码、不可登录,天然降低滥用风险。
容易被忽略的兼容性细节
MySQL 8.0.16+才支持对mysql.user表的细粒度DML权限(之前只能全库ALL PRIVILEGES);如果你用的是8.0.12或更早版本,非root用户根本无法通过SQL修改其他用户密码——只能靠ALTER USER ... IDENTIFIED BY,而这又要求CREATE USER权限。另外,validate_password插件启用后,非root用户设密码时若不符合策略(如长度ERROR 1819 (HY000),而非提示,这点常被漏测。


















