MySQL 8.0必须分两步创建用户:先CREATE USER指定'username'@'host'和密码(推荐IDENTIFIED WITH mysql_native_password),再GRANT授权;禁止使用GRANT一步建户,且'%'不包含localhost。

MySQL 8.0 无法创建新用户,基本都是因为用了过时的 GRANT 一步建户写法,或者密码/主机格式不合规。
CREATE USER 报错 ERROR 1410 或语法错误
这是最常见现象:执行类似 GRANT ALL ON *.* TO 'u'@'%' IDENTIFIED BY 'p'; 直接失败。MySQL 8.0+ 已彻底废弃该写法,GRANT 不再具备建户能力。
- 必须拆成两步:
CREATE USER→GRANT,顺序不能反 - 主机部分不能省略,哪怕想允许所有地址,也得显式写成
'u'@'%',不能只写'u' - 密码含特殊字符(如
!、@、#)时,命令行登录要单引号包裹,否则 shell 会报event not found类错误 - 若提示
ERROR 1819 (HY000),说明密码不满足validate_password策略,需加大小写字母、数字、特殊字符,且长度 ≥8
用户创建后无法登录:caching_sha2_password 不兼容
新建用户能连上 root,但用新用户登录时报错 ERROR 2058 (HY000): Plugin caching_sha2_password could not be loaded,本质是客户端不支持 MySQL 8.0 默认认证插件。
- 临时解决:建户时强制指定旧插件:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p'; - 长期建议:升级客户端驱动(如 PyMySQL ≥1.0.2、mysql-connector-python ≥8.0.16)
- 不要改全局默认插件(
default_authentication_plugin),只针对具体用户调整更安全
FLUSH PRIVILEGES 到底要不要执行
很多人卡在这一步:建户、授权完,应用还是连不上或权限无效。
-
CREATE USER和GRANT在 MySQL 8.0 大多数情况下已自动重载权限缓存,FLUSH PRIVILEGES非必需 - 但如果你同时手动改过
mysql.user表(比如用UPDATE改密码),就必须执行FLUSH PRIVILEGES - 保险起见,建户+授权后加一句
FLUSH PRIVILEGES;不会出错,只是多一次无害调用
真正容易被忽略的是主机匹配逻辑——'u'@'192.168.1.%' 和 'u'@'192.168.1.100' 是两个完全独立的账号,连密码都可以不同;而 'u'@'%' 不包含 localhost,本地连接仍可能走 socket 走 'u'@'localhost' 这条记录,这点在调试远程连接失败时最常踩坑。











