mysql 8.0+ 必须先 create user 再 grant,否则报错1410;host需精确匹配,密码插件caching_sha2_password可能不兼容旧客户端,授权须指定数据库名如myapp_db.*,删用户前建议先revoke权限。

CREATE USER 语法和常见失败原因
MySQL 8.0+ 默认不允许直接用 GRANT 创建用户,必须先显式执行 CREATE USER。如果跳过这步直接 GRANT,会报错 ERROR 1410 (42000): You are not allowed to create a user with GRANT。
正确写法是:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password123';
-
'app_user'@'localhost'中的localhost表示只允许本机连接;若需远程访问,改用'app_user'@'%'(注意:生产环境慎用%) - 密码必须满足当前 MySQL 的密码策略(如
validate_password插件启用时要求长度、大小写、数字等) - MySQL 8.0 默认认证插件是
caching_sha2_password,旧客户端可能不兼容——可加IDENTIFIED WITH mysql_native_password BY 'xxx'强制降级
GRANT 权限时必须指定数据库名,不能只给全局权限
想让用户只能操作 myapp_db,就别用 GRANT ALL ON *.*。漏写数据库名或写成 myapp_db.* 以外的形式,会导致权限不生效或范围过大。
典型授权语句:
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'app_user'@'localhost';
- 权限列表必须明确,
ALL PRIVILEGES在生产库中风险高,尽量按最小权限原则拆分 -
myapp_db.*表示该数据库下所有表;若只想授给某张表,写成myapp_db.users - 执行完
GRANT后,MySQL 8.0+ 不再自动FLUSH PRIVILEGES,但建议仍手动执行一次确保立即生效
用户创建后无法登录?检查 host 匹配和密码插件
即使 CREATE USER 和 GRANT 都成功,用户也可能连不上,最常踩的两个坑是:
- 客户端连接时用的 host 和创建用户时的 host 不一致:比如创建的是
'app_user'@'192.168.1.%',但程序连的是192.168.1.100—— 这没问题;但如果连的是localhost,而用户只定义了'app_user'@'127.0.0.1',就会拒绝 - 密码插件不兼容:用
mysql -u app_user -p登录失败且提示Authentication plugin 'caching_sha2_password' cannot be loaded,说明客户端太老。解决方式是在CREATE USER时加IDENTIFIED WITH mysql_native_password,或升级客户端 - 确认用户是否真被创建:查
SELECT User, Host FROM mysql.user WHERE User = 'app_user';
撤销权限或删除用户要分两步,不能只删用户
直接 DROP USER 'app_user'@'localhost' 会连带清除权限记录,但如果你只想回收权限、保留账号,就得用 REVOKE:
REVOKE INSERT, UPDATE ON myapp_db.* FROM 'app_user'@'localhost';
-
REVOKE不会自动FLUSH PRIVILEGES,同样建议手动刷一次 - 删除用户前,最好先
REVOKE ALL PRIVILEGES ON *.* FROM 'app_user'@'localhost';,避免残留权限影响审计 - MySQL 8.0+ 删除用户后,其权限记录彻底消失,无法回溯——重要账号建议用注释说明用途并记录在配置管理工具中
权限系统里最易被忽略的是 host 字符串的精确匹配逻辑,以及 caching_sha2_password 在混合环境中的实际兼容性。这两点不验证清楚,光看命令执行成功没用。











