MySQL 8.0+彻底移除GRANT中IDENTIFIED BY语法,必须分两步:先CREATE USER(可指定mysql_native_password插件)再GRANT授权,且用户身份与权限控制完全解耦。

MySQL 8.0 中只要 GRANT 里出现 IDENTIFIED BY,就必然报 ERROR 1064 或 ERROR 1410 ——这不是配置错、密码错、主机名错,是语法被彻底移除。
确认是不是 MySQL 8.0+ 导致的报错
别凭印象判断版本,Docker 镜像、云数据库默认已是 8.0,而本地可能还是 5.7。执行这条语句看准:
SELECT VERSION();
如果返回类似 8.0.33、8.3.0 或 9.6.0,那就坐实了必须改写法。
- 返回
5.7.x:原写法仍可用,问题在别处 - 返回
8.0+:所有含IDENTIFIED BY的GRANT语句都得拆开 - Percona/MariaDB 兼容 MySQL 8.0 协议时,同样适用该规则
CREATE USER 和 GRANT 必须分两步执行
顺序不能颠倒,GRANT 语句里绝不可再带 IDENTIFIED BY,否则立刻报错。
- 先创建用户(含密码):
CREATE USER 'u1'@'%' IDENTIFIED BY 'pwd123'; - 再授予权限(不带密码):
GRANT SELECT, INSERT ON mydb.* TO 'u1'@'%'; - 需要全局权限?用:
GRANT ALL PRIVILEGES ON *.* TO 'u1'@'%'; - 建议加上:
FLUSH PRIVILEGES;(尤其跨客户端操作后)
若用户已存在,CREATE USER 会报错,此时改用:ALTER USER 'u1'@'%' IDENTIFIED BY 'newpwd';
连得上但登不上?可能是 caching_sha2_password 插件不兼容
即使语法全对、GRANT 成功、FLUSH PRIVILEGES 也执行了,仍可能卡在 “Authenticating…” 或报 Access denied for user ——旧版客户端(如老版 MySQL Workbench、某些 JDBC 驱动、PHP mysqli)不支持 MySQL 8.0 默认的 caching_sha2_password 认证插件。
- 创建时显式指定兼容插件:
CREATE USER 'u1'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123'; - 或全局降级(需重启服务):在
my.cnf中加default_authentication_plugin=mysql_native_password
这个点常被跳过,直到应用连不上才回头排查;其实应在创建第一个 8.0 用户时就定好插件策略。
容易忽略的 NO_AUTO_CREATE_USER 和 sql_mode 问题
如果你的初始化脚本里还带着 NO_AUTO_CREATE_USER,也会触发报错:
SET sql_mode = 'NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES';
MySQL 8.0+ 已完全移除该模式值,直接删掉即可。
- 错误提示:
Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER' - 解决方式:从
sql_mode字符串中剔除NO_AUTO_CREATE_USER - 同理,
GRANT ... IDENTIFIED BY在任何上下文(包括脚本、Docker entrypoint、CI 流水线)中都不再合法
最麻烦的不是语法改不了,而是不同环境 MySQL 版本混用——开发机是 5.7,测试库是 8.0,上线库是 9.6,同一份 SQL 脚本跑三遍,错三次。


















