mysql 8.0+中grant报错1410的直接原因是该版本彻底移除grant隐式建户能力,必须先create user(推荐指定mysql_native_password插件)再grant授权,且两者必须分步执行、顺序不可颠倒。

MySQL 8.0+中GRANT报错1410的直接原因
因为 MySQL 8.0.16 起彻底移除了 GRANT 隐式创建用户的能力——只要目标用户(如 'u'@'%' )在 mysql.user 表里不存在,GRANT 就会立刻拒绝执行,并抛出 ERROR 1410 (42000): You are not allowed to create a user with GRANT。这不是语法错误,而是权限模型的硬性拦截。
CREATE USER 和 GRANT 必须严格分两步执行
旧版写法 GRANT SELECT ON db.* TO 'u'@'%' IDENTIFIED BY 'pwd' 在 8.0+ 已非法;新流程必须拆开:
- 第一步用
CREATE USER显式注册账户,必须带认证插件声明(如IDENTIFIED WITH mysql_native_password BY 'pwd'),否则可能触发ERROR 1819(密码策略不满足) - 第二步用
GRANT授予权限,严禁再出现IDENTIFIED BY子句,否则语法报错ERROR 1064 - 执行完建议加
FLUSH PRIVILEGES,尤其在非 root 用户或权限缓存未自动刷新的场景下
常见踩坑点:host 匹配、权限来源与上下文限制
即使用户已存在,GRANT 仍可能失败,原因常被忽略:
-
'u'@'localhost'和'u'@'%'是两个完全不同的账户,host 不匹配会导致“用户不存在”假象 - 执行
GRANT的当前登录用户(如'admin'@'10.0.1.%')必须拥有CREATE USER权限(用于验证目标用户是否存在)和GRANT OPTION(用于授予权限),缺一不可 - 若用
'root'@'localhost'登录,却想给'u'@'192.168.1.100'授权,MySQL 会检查 host 范围是否允许跨域操作,此时需确认 root 自身的host字段是否为'%'或明确包含该 IP
远程访问配置时最容易漏掉的一步
很多用户卡在“明明 CREATE USER 成功了,GRANT 却报 1410”,真实原因是:MySQL 默认只允许 'root'@'localhost',而你正用这个账户去操作远程主机用户。必须先放开 root 的 host 限制:
- 运行
UPDATE mysql.user SET host = '%' WHERE user = 'root' - 紧接着执行
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'(不是GRANT ... TO 'root'@'localhost') - 最后别忘了
FLUSH PRIVILEGES,否则修改不会生效
这三步缺一不可,且顺序不能颠倒——host 字段改完不重赋权限,root 依然没有跨 host 授权能力。











