mysql 8.0 彻底移除 grant 中 identified by 语法,必须分两步:先 create user 创建用户并设密码,再 grant 授予权限,否则必报 error 1064 或 1410;同时需注意默认认证插件 caching_sha2_password 的客户端兼容性问题。

MySQL 8.0 无法在 GRANT 语句里直接建用户,不是配置或权限问题,而是语法被彻底移除——只要 GRANT 后面跟了 IDENTIFIED BY,就必然报 ERROR 1064 或 ERROR 1410。
GRANT 报 ERROR 1064 / ERROR 1410 怎么快速定位
这类错误几乎全是因沿用旧写法导致。典型错误语句包括:
GRANT ALL ON *.* TO 'u'@'%' IDENTIFIED BY 'p';GRANT SELECT ON db.* TO 'u2'@'localhost' IDENTIFIED BY 'abc';
执行前先确认版本:
SELECT VERSION();
若返回 8.0.33、8.3.0 等,就坐实必须分步操作。注意:Docker 镜像、阿里云 RDS、腾讯云 CVM 上的 MySQL 默认已是 8.0+,别凭本地 5.7 经验判断。
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'@'%'; - 用户已存在时,改用:
ALTER USER 'u1'@'%' IDENTIFIED BY 'newpwd';
FLUSH PRIVILEGES; 建议加上——虽然多数情况下自动重载,但跨客户端或脚本部署时,显式刷新更可控。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
新建用户连不上?大概率是 caching_sha2_password 插件不兼容
即使 CREATE USER 和 GRANT 全成功,仍可能遇到:
- MySQL Workbench 卡在 “Authenticating…”
- JDBC 报
Access denied for user(用户名密码没错) - PHP
mysqli_connect()失败,错误含caching_sha2_password
根本原因是 MySQL 8.0 默认用 caching_sha2_password,而旧版客户端(如 PyMySQL mysql-connector-python
- 建户时强制指定旧插件:
CREATE USER 'u1'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123'; - 避免全局修改
default_authentication_plugin,只针对具体用户调整更安全
别等应用连不上才回头查——这个点应在创建第一个 8.0 用户时就定下来。
Host 匹配失败是最隐蔽的权限不生效原因
'u'@'%' 不包含 localhost,这是最常被忽略的设计细节:
- 本地用
mysql -u u -p连接,默认走 Unix socket,匹配的是'u'@'localhost',而非'u'@'%' -
'u'@'192.168.1.%'和'u'@'192.168.1.100'是两个完全独立账号,密码、权限都可不同 - 验证是否生效,不能只看命令没报错,要真实连接:
mysql -h 127.0.0.1 -u u -p(强制走 TCP)和mysql -u u -p(走 socket)应分别测试
真正卡住人的,往往不是语法写错,而是 Host 字符串有空格、大小写差异,或误以为 % 覆盖了所有场景。










