grant all privileges本身不包含grant option,必须显式添加with grant option才能赋予转授权限;mysql 8.0+需先create user再grant,且grant option仅在其对应权限作用域内生效。

GRANT OPTION 没显式加上,用户就真不能转授
MySQL 的 GRANT ALL PRIVILEGES 本身不包含 GRANT OPTION——这是权限模型的硬性设计,不是遗漏或 bug。哪怕你用 root 执行 GRANT ALL ON *.* TO 'u'@'%',SHOW GRANTS FOR 'u'@'%' 里也绝不会出现 GRANT OPTION,该用户执行任何 GRANT 都会直接报 ERROR 1045 (28000): Access denied。
必须显式加 WITH GRANT OPTION 才能开通转授权能力:
-
GRANT ALL PRIVILEGES ON *.* TO 'u'@'%' WITH GRANT OPTION;✅ 全局+可转授 -
GRANT SELECT, INSERT ON app.* TO 'dev'@'localhost' WITH GRANT OPTION;✅ 仅限 app 库的 SELECT/INSERT 可转授 -
GRANT ALL PRIVILEGES ON *.* TO 'u'@'%';❌ 没WITH,就不能GRANT
MySQL 8.0+ 要求先 CREATE USER,再 GRANT,否则根本走不到权限检查
在 MySQL 8.0 及以上版本,GRANT ... IDENTIFIED BY 语法已被彻底移除。如果你写 GRANT ALL ON *.* TO 'u'@'%' IDENTIFIED BY 'pwd' WITH GRANT OPTION,会立刻触发 ERROR 1064 (42000),连权限校验环节都进不去——因为语法解析就失败了。
正确流程只有两步,且顺序不能颠倒:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 先创建用户:
CREATE USER 'u'@'%' IDENTIFIED BY 'pwd'; - 再赋权(含转授权):
GRANT ALL PRIVILEGES ON *.* TO 'u'@'%' WITH GRANT OPTION; - 最后保险起见执行:
FLUSH PRIVILEGES;(尤其在直连 socket 或权限缓存延迟时)
Host 不匹配导致 GRANT 失败,用户压根不存在
错误 ERROR 1410 (42000): You are not allowed to create a user with GRANT 的本质是:你写的 'u'@'h' 在 mysql.user 表里根本查不到。MySQL 想隐式创建,但 8.0+ 已禁用该行为。
必须确认真实 host:
- 查表验证:
SELECT user, host FROM mysql.user WHERE user = 'u'; - 常见错配:
'u'@'localhost'vs'u'@'127.0.0.1'vs'u'@'%'—— 它们是三个独立账户 - 如果用户已存在但 host 不对,不能靠
GRANT修正,得用ALTER USER 'u'@'old_host' RENAME TO 'u'@'new_host';或重建
GRANT OPTION 只在其对应作用域内生效,跨库/跨权限无效
WITH GRANT OPTION 不是“万能转授权开关”,它严格绑定在当前 GRANT 语句的权限粒度上。比如:
-
GRANT SELECT ON db1.* TO 'a'@'%' WITH GRANT OPTION;→a只能把SELECT授给db1下的表,不能授UPDATE,也不能授db2 -
GRANT CREATE, DROP ON db1.* TO 'b'@'%' WITH GRANT OPTION;→b转授时若漏掉CREATE,被授者仍无法建表 - 想让某用户能任意转授?唯一方式是:
GRANT ALL PRIVILEGES ON *.* TO 'c'@'%' WITH GRANT OPTION;
多个 GRANT 语句授予的权限不会自动合并 GRANT OPTION;每个作用域单独判断,不可叠加。










