mysql 8.0创建用户必须显式指定符合密码策略的强密码,先查策略show variables like 'validate_password%',测试环境可设set global validate_password.policy = low,密码需含大小写字母、数字、特殊字符,且长度≥4;主机写'%'前需确保bind-address非127.0.0.1并开放3306端口;grant后必须执行flush privileges;若客户端不兼容caching_sha2_password,应显式指定identified with mysql_native_password。

CREATE USER 必须显式指定密码且满足强度策略
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!@#' - 主机名写
'%'表示允许任意 IP 连接,但前提是 MySQL 服务本身监听了非127.0.0.1的地址(见下节)
bind-address 和防火墙决定“远程连得上”还是“连不上”
即使 CREATE USER 和 GRANT 全部成功,用户仍可能遇到 Can't connect to MySQL server 或连接超时——问题根本不在权限,而在网络层。
实操建议:
- 检查 MySQL 配置文件(通常是
/etc/mysql/mysql.conf.d/mysqld.cnf),确认bind-address不是127.0.0.1;改成0.0.0.0或具体内网 IP 才能接受远程连接 - 修改后必须重启服务:
sudo systemctl restart mysql - Ubuntu/Debian 系统需开放 3306 端口:
sudo ufw allow 3306;CentOS 用firewall-cmd - 云服务器(如阿里云、腾讯云)还需在安全组中放行 3306 入方向规则
GRANT 后必须执行 FLUSH PRIVILEGES
MySQL 8.0 中 GRANT 命令不再隐式刷新权限表,漏掉 FLUSH PRIVILEGES; 是权限不生效的最常见原因。现象是:用户能登录,但 SHOW DATABASES; 只看到 information_schema,查不到自己被授权的库。
实操建议:
- 授权语句和刷新必须成对出现,例如:
GRANT SELECT, INSERT ON myapp.* TO 'appuser'@'%';FLUSH PRIVILEGES; - 不要依赖“自动刷新”,旧版本也建议加,统一行为更可靠
- 若用
CREATE USER+GRANT分两步,FLUSH PRIVILEGES只需一次,在GRANT后执行即可 - 检查权限是否生效,用
SHOW GRANTS FOR 'appuser'@'%';直接验证
认证插件 mismatch 导致客户端报“Access denied”
MySQL 8.0 默认用 caching_sha2_password 插件,但很多老客户端(如某些 Python MySQLdb、旧版 Navicat、PHP 7.4 以下)只支持 mysql_native_password。现象是:用户创建成功、权限已给、网络通畅,但客户端死活连不上,错误可能是 Authentication plugin 'caching_sha2_password' cannot be loaded 或静默拒绝。
实操建议:
- 创建用户时指定插件:
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc123!@#'; - 或创建后修改:
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc123!@#'; - 改完仍要
FLUSH PRIVILEGES; - 不推荐全局降级认证方式(如改
default_authentication_plugin),会影响所有新用户
远程权限不是“建个用户+赋权”就完事的线性流程,而是横跨密码策略、网络配置、权限加载、认证协议四层的协同动作。任何一层卡住,都会表现为“明明命令都执行了却连不上”,排查时优先看错误类型:是连接失败(网络层)、登录失败(认证层)、还是登录后无库(权限层)。











