MySQL 8.0报ERROR 1410的直接原因是GRANT语句中隐式创建用户被禁用,必须先执行CREATE USER(推荐指定mysql_native_password插件)再执行GRANT授权,且两者严格分步、顺序不可颠倒。

MySQL 8.0 报 ERROR 1410 就是 CREATE 和 GRANT 没拆开
ERROR 1410 (42000): You are not allowed to create a user with GRANT 不是权限不足,也不是密码错,而是 MySQL 8.0 明确拒绝把「建用户」和「授权限」塞进一条 GRANT 语句里。哪怕你是 root,这条语法也直接被 parser 拦下来,不执行、不降级、不提示替代方案。
-
GRANT SELECT ON mydb.* TO 'u'@'%' IDENTIFIED BY 'p'—— 这种写法在 5.7 可行,8.0 直接报ERROR 1064或ERROR 1410 - 根本原因是认证(identity)和授权(privilege)被强制解耦:密码策略、插件类型、账户锁定状态归
CREATE USER管;权限范围、对象粒度、是否可转授归GRANT管 - 旧脚本迁移时最稳妥的正则替换是:
GRANT (.+) ON (.+) TO '(.+)'@'(.+)' IDENTIFIED BY '(.+)'→ 拆成两行:CREATE USER '$3'@$4 IDENTIFIED BY '$5';+GRANT $1 ON $2 TO '$3'@$4;
CREATE USER 不指定插件,连不上客户端很常见
MySQL 8.0 默认用 caching_sha2_password 插件,但很多生产环境还在用老版本 Navicat、DBeaver、Python mysql-connector-python < 8.0.23、PHP mysqli 扩展——它们不支持该插件,连接时卡在 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 必须显式写
IDENTIFIED WITH mysql_native_password BY 'xxx',不能只写IDENTIFIED BY 'xxx' - 如果已用默认插件创建了用户,改插件要用:
ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 检查当前用户用的什么插件:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'u';
GRANT EXECUTE ON PROCEDURE 前必须先有 USAGE 权限
给用户授权调用存储过程,光写 GRANT EXECUTE ON PROCEDURE db.sp_name TO 'u'@'%' 是不够的。MySQL 8.0+ 要求用户对目标数据库至少有 USAGE 权限(即“能连上这个库”的最低身份凭证),否则 EXECUTE 权限根本不注册进权限系统。
- 先补一句:
GRANT USAGE ON db.* TO 'u'@'%'; - 再执行:
GRANT EXECUTE ON PROCEDURE db.sp_name TO 'u'@'%'; - 注意:
USAGE不代表能查表,它只是权限系统的“占位符”,没有实际操作能力,但它是EXECUTE、TRIGGER、EVENT等对象级权限的前提 - 验证是否生效:
SHOW GRANTS FOR 'u'@'%';必须看到两行输出,缺一不可
权限不生效?大概率是 host 匹配错了或连接没重试
执行完 CREATE USER 和 GRANT 后仍报 Access denied,不是命令写错,而是 MySQL 的权限匹配机制在起作用:它会按 User + Host 组合精确匹配,且已存在的连接不会自动刷新权限。
- 检查用户是否真存在:
SELECT User, Host FROM mysql.user WHERE User = 'u';—— 注意'u'@'localhost'和'u'@'%'是两个完全不同的账号 - 应用连接池里的长连接不会感知新权限,必须重启服务或让连接断开重连
- 测试时别只用
mysql -u u -p,要明确指定 host:mysql -u u -p -h 192.168.10.100,否则可能命中'u'@'localhost'这个不同账号 - 临时调试可加
FLUSH PRIVILEGES;,虽然多数情况下非必需,但在跨客户端或脚本批量操作后加一句更稳
真正麻烦的从来不是记不住命令,而是你以为执行完了就结束了,其实 MySQL 正在后台按 host、plugin、database scope 一层层做匹配——漏掉任意一个环节,权限就悬在半空里。


















