MySQL 8.4中CREATE USER与GRANT必须分步执行且不可合并,需显式指定host、认证插件及密码策略,GRANT后无需FLUSH PRIVILEGES,权限自动生效,但远程连接需同步检查bind-address、防火墙及plugin兼容性。

CREATE USER 和 GRANT 是 MySQL 8.4 创建与管理用户的两个核心操作,不是“先建库再授权”或“图形界面点点点”就能绕开的逻辑链。直接上手时,多数人卡在权限不生效、远程连不上、密码报错这三类问题上。
CREATE USER 语句必须带 host 指定,不能省略 '@' 部分
MySQL 把 'user' 和 'user'@'localhost' 视为完全不同的账号。漏写 host(比如只写 CREATE USER 'dzm')会默认创建 'dzm'@'%',但实际行为受 sql_mode 和版本影响,8.4 默认严格校验,大概率报错 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option 或提示 host 缺失。
- 本地开发用
'dzm'@'localhost',Windows 下尤其注意:localhost 不等价于 127.0.0.1(前者走 socket,后者走 TCP) - 允许任意 IP 连接写
'dzm'@'%',但生产环境严禁这样用 - 限定内网段更安全,例如
'app'@'192.168.1.%'或'backup'@'10.0.0.5' - 创建时可直接加选项:
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'P@ssw0rd123' PASSWORD EXPIRE NEVER ACCOUNT UNLOCK;
GRANT 权限后必须执行 FLUSH PRIVILEGES 吗?
MySQL 8.4 中,GRANT 本身会自动刷新内存中的权限表,FLUSH PRIVILEGES 不是必需步骤。但如果你用 INSERT INTO mysql.user 或直接改系统表的方式授予权限(不推荐),才需要手动刷。
- 正确做法:用
GRANT ALL PRIVILEGES ON test_db.* TO 'dzm'@'localhost';→ 权限立即生效 - 错误习惯:每次
GRANT后都跟一句FLUSH PRIVILEGES,冗余且可能掩盖真实问题 - 验证权限是否生效:用
SHOW GRANTS FOR 'dzm'@'localhost';,别只查mysql.user表 - 撤销权限用
REVOKE,不是DROP USER;后者会删账号,前者只收权限
远程连接失败?重点检查 plugin 和 bind-address
MySQL 8.4 默认使用 caching_sha2_password 插件,老客户端(如某些 Navicat 旧版、PHP 7.4 以下)不支持,会报错 Client does not support authentication protocol requested by server。
- 临时兼容方案:
ALTER USER 'dzm'@'%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd123'; - 确认
my.ini中没有bind-address = 127.0.0.1(这会禁止外部访问),应改为bind-address = 0.0.0.0或注释掉 - Windows 防火墙要放行 3306 端口,不是只配 MySQL 就完事
-
SELECT User, Host, plugin FROM mysql.user;查看用户认证方式,避免用root账号远程直连
删除用户前,先确认它没被任何应用依赖
DROP USER 'dzm'@'localhost'; 会立刻清除账号及其所有权限,不可逆。线上误操作常导致服务中断。
- 删之前先查连接:
SELECT * FROM performance_schema.threads WHERE PROCESSLIST_USER = 'dzm'; - 若正在被用,先
REVOKE ALL PRIVILEGES ON *.* FROM 'dzm'@'localhost';再观察 1–2 天 - 不要用
DELETE FROM mysql.user手动删记录,8.4 的权限缓存机制会让它失效或引发不一致 - 批量清理测试账号可用
DROP USER IF EXISTS 'test1'@'localhost', 'test2'@'%';
真正麻烦的从来不是语法写对没,而是 host 匹配规则、plugin 兼容性、防火墙和配置文件之间的隐式耦合。哪怕一条 CREATE USER 执行成功,也不代表你能连上去——得逐层验证网络、认证、授权三层是否全部打通。


















