不能只跑一条 create user 就完事,必须同步处理密码策略、认证插件、网络监听和权限刷新四个环节,漏一个就连不上。

直接说结论:不能只跑一条 CREATE USER 就完事,必须同步处理密码策略、认证插件、网络监听和权限刷新四个环节,漏一个就连不上。
密码强度不达标会直接报 ERROR 1819
MySQL 8.0 默认启用 validate_password 插件,CREATE USER 'u'@'%' IDENTIFIED BY '123' 这种弱密码会立刻失败,错误信息是:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
实操建议:
- 先查策略:
SHOW VARIABLES LIKE 'validate_password%';,重点关注validate_password.policy(0=LOW,1=MEDIUM,2=STRONG) - 测试环境可临时设为 LOW:
SET GLOBAL validate_password.policy = LOW;(仅限非生产) - 生产环境密码必须含大小写字母 + 数字 + 特殊字符,例如:
'Abc123!@#'
远程连不上?大概率是 bind-address 没改或防火墙拦了
即使用户创建成功、权限也给了,Host 'x.x.x.x' is not allowed to connect 或连接超时,问题根本不在 SQL,而在服务监听和网络层。
实操建议:
- 检查配置文件(如
/etc/mysql/mysql.conf.d/mysqld.cnf),确认bind-address不是127.0.0.1;改成0.0.0.0或具体内网 IP - 改完必须重启:
sudo systemctl restart mysql - Ubuntu/Debian 开放端口:
sudo ufw allow 3306;CentOS:firewall-cmd --zone=public --add-port=3306/tcp --permanent && firewall-cmd --reload - 云服务器(阿里云、腾讯云等)务必在安全组里放行 3306 入方向
客户端报 Auth plugin 'caching_sha2_password' cannot be loaded
MySQL 8.0 默认用 caching_sha2_password 认证,但很多旧客户端(如 Navicat 旧版、某些 JDBC 驱动)不支持,会直接拒绝连接。
实操建议:
- 创建用户时显式指定插件:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc123!@#'; - 如果用户已存在,用
ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc123!@#'; - 不要依赖
GRANT ... IDENTIFIED BY——MySQL 8.0 中该语法已被移除,GRANT不再负责设密码
GRANT 之后不执行 FLUSH PRIVILEGES 就等于没授权
MySQL 8.0 的权限系统不再自动刷新,GRANT ALL ON testdb.* TO 'u'@'%'; 执行完,用户登录后仍只能看到 information_schema,查不到被授权的库。
实操建议:
- 每完成一次
GRANT或CREATE USER,紧跟着执行:FLUSH PRIVILEGES; - 不要省略分号,也不要误写成
FLUSH PRIVILEGE(少 s 就报错) - 如果用的是
UPDATE user SET host='%' WHERE user='u';这种老方法,更必须FLUSH PRIVILEGES;,否则修改完全无效
最易被忽略的点是:bind-address 和 plugin 是两个独立开关,改了密码策略不代表能连上,开了远程访问不代表认证能过。四个环节——密码、监听、认证、权限刷新——缺一不可,且顺序不能乱。











