MySQL 8.0创建远程用户必须先CREATE USER再GRANT,否则报ERROR 1410;需显式指定mysql_native_password插件、强密码,修改bind-address=0.0.0.0,开放防火墙3306端口,并执行FLUSH PRIVILEGES。

MySQL 8.0 创建远程连接用户不能只写 GRANT,必须先 CREATE USER,否则直接报 ERROR 1410;而且即使语句全对,连不上大概率是 bind-address 没改、防火墙没开、或认证插件不兼容。
CREATE USER 必须显式指定插件和强密码
MySQL 8.0 默认用 caching_sha2_password,但 Navicat、DBeaver、旧版 JDBC 驱动等多数客户端不支持,直连会触发 ERROR 2059 (HY000)。别指望改 root 用户——生产环境禁止 root 远程登录。
- 创建用户时必须显式指定插件:
CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc123!@#'; - 密码需满足强度策略:默认
validate_password.policy = MEDIUM,要求大小写字母 + 数字 + 特殊字符,长度 ≥ 8;查策略用SHOW VARIABLES LIKE 'validate_password%'; - 若测试环境想临时放宽,运行
SET GLOBAL validate_password.policy = LOW;(仅限非生产) - 已存在同名用户但插件不对?先删掉:
DROP USER 'app'@'%';
GRANT 后必须执行 FLUSH PRIVILEGES
MySQL 8.0 的 GRANT 不再自动刷新权限缓存,漏掉这步,用户能登录,但 SHOW DATABASES; 只看到 information_schema,授权的库根本不可见。
- 授权语句必须严格匹配
CREATE USER中的 host:GRANT SELECT, INSERT ON mydb.* TO 'app'@'%'; - 避免
GRANT ALL ON *.*——最小权限原则,业务只需读写某库,就别给全局权限 - 授完权立刻执行:
FLUSH PRIVILEGES; - 验证是否生效:
SELECT host, user, plugin FROM mysql.user WHERE user = 'app';,确认plugin列是mysql_native_password
bind-address = 0.0.0.0 是硬性前提
即使 'app'@'%' 创建成功、权限也刷了,telnet your_ip 3306 仍超时,问题一定出在网络层——MySQL 根本没监听外部请求。
- Windows 下修改
phpEnv\MySQL\conf\my.ini或 Linux 下修改/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address = 127.0.0.1,改为bind-address = 0.0.0.0 - 改完必须重启服务:
sudo systemctl restart mysql(Linux)或在 Windows 服务管理器中重启 MySQL 服务 - 顺手检查防火墙:Ubuntu/Debian 执行
sudo ufw allow 3306;Windows 防火墙需新建入站规则放行 TCP 3306;云服务器(阿里云、腾讯云)还必须配置安全组
最容易被忽略的是:本地用 localhost 能连,不代表远程能连——'app'@'localhost' 和 'app'@'127.0.0.1' 在 MySQL 权限系统里是两个账号,而 'app'@'%' 要求服务端实际监听非回环地址。每一步都得对上,少一个环节,远程连接就卡在超时或认证失败。


















