MySQL 8.0+ 创建用户需满足密码策略,显式指定强密码;GRANT 权限需按层级精确授权并执行 FLUSH PRIVILEGES;权限匹配优先最具体 host,注意认证插件兼容性及 ACCOUNT LOCK 等安全操作。

CREATE USER 语法和常见失败原因
直接执行 CREATE USER 'newuser'@'localhost' 很可能报错,因为 MySQL 8.0+ 默认启用 validate_password 插件,密码强度不达标就会拒绝创建。错误信息通常是:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
实操建议:
- 先检查策略:运行
SHOW VARIABLES LIKE 'validate_password%';看当前等级(如validate_password.policy=1表示 MEDIUM) - 临时调低策略(仅测试环境):
SET GLOBAL validate_password.policy = LOW; - 创建用户时必须显式指定密码,MySQL 8.0+ 不再支持空密码:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'StrongPass123!'; - 注意主机名写法:
'newuser'@'%'允许远程连接,但需确认bind-address未设为127.0.0.1(否则远程连不上)
GRANT 分配权限时的范围与粒度控制
GRANT 不是“给库就自动有表”,权限是分层生效的。比如只执行 GRANT SELECT ON mydb.* TO 'newuser'@'localhost';,用户能查 mydb 下所有表,但不能 USE mydb —— 因为 USAGE 权限(连接能力)是隐式授予的,而 SELECT 是对象级权限,不包含数据库级操作。
实操建议:
- 最小权限原则:避免用
GRANT ALL PRIVILEGES ON *.*,生产环境应限定到具体库、表甚至列 - 若要允许用户创建表,需额外给
CREATE权限:GRANT SELECT, INSERT, CREATE ON mydb.* TO 'newuser'@'localhost'; - MySQL 8.0+ 中,
GRANT不会自动刷新权限表,必须执行FLUSH PRIVILEGES;才生效(旧版本也建议加,确保一致) - 分配列级权限(如只让查
users.email)语法是:GRANT SELECT(email) ON mydb.users TO 'newuser'@'localhost';
用户权限不生效的典型排查点
执行完 CREATE USER 和 GRANT 后仍连不上或报 Access denied,大概率不是命令写错,而是权限匹配逻辑没理清。
关键判断依据是 MySQL 的权限匹配顺序:先按 user@host 最精确匹配(如 'newuser'@'192.168.1.100' 优先于 'newuser'@'%'),再看权限是否覆盖当前操作。
实操建议:
- 确认登录时用的 host 是否和授权 host 一致:用
mysql -u newuser -h 127.0.0.1 -p连接,对应的是'newuser'@'127.0.0.1',不是'newuser'@'localhost'(二者在 Unix socket 下不等价) - 查实际生效权限:
SHOW GRANTS FOR 'newuser'@'localhost';,别只信自己刚敲的命令 - 如果用户从远程连接失败,检查系统防火墙是否放行 3306 端口,且 MySQL 用户 host 不是
localhost(本地 socket 专用) - MySQL 8.0 默认认证插件是
caching_sha2_password,某些老客户端不兼容,可建用户时指定:CREATE USER 'newuser'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
撤销权限与删除用户的正确顺序
删用户前不撤权限,残留记录可能影响新同名用户;直接 DROP USER 而不 FLUSH PRIVILEGES,部分版本权限缓存不会立即清理。
实操建议:
- 先回收权限:
REVOKE ALL PRIVILEGES ON *.* FROM 'newuser'@'localhost';(注意:不带GRANT OPTION的用户,无法被REVOKE掉别人授的权) - 再删用户:
DROP USER 'newuser'@'localhost'; - 最后强制刷新:
FLUSH PRIVILEGES; - 如果只是临时禁用,比删用户更安全的做法是锁定:
ALTER USER 'newuser'@'localhost' ACCOUNT LOCK;(MySQL 5.7.6+ 支持)
权限系统真正的复杂点不在命令本身,而在 host 匹配规则、认证插件差异、以及权限层级叠加后的实际效果——这些细节往往只在换环境、升级 MySQL 或对接新客户端时才暴露出来。


















