mysql 5.7 创建远程用户必须显式指定 'username'@'host' 格式,如 'user'@'%' 或 'user'@'192.168.1.100';需同步修改 bind-address = 0.0.0.0、放行3306端口、避免 grant all on *.* 等高危操作,并启用强密码策略。

MySQL 5.7 创建远程用户必须指定 'username'@'host' 格式
MySQL 的权限模型不是“用户名 + 密码”就够了,而是靠 user 和 host 两个字段共同构成唯一账户。比如 'root'@'localhost' 和 'root'@'%' 完全是两个账号,互不继承权限。
常见错误是只执行 GRANT ALL ON *.* TO 'remote_user' IDENTIFIED BY 'pwd'; —— 这在 MySQL 5.7 中会报错或创建出仅限 localhost 的用户(取决于 sql_mode),根本无法远程连。
- 必须显式写出 host 部分:
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPass123!'; - 若只要某台机器连,用具体 IP:
'remote_user'@'192.168.1.100' - 若限定某网段,可用通配符:
'remote_user'@'10.0.42.%' - 不要用
'%'配合 root 用户,这是高危操作
授权时避免直接用 GRANT ALL PRIVILEGES ON *.*
生产环境里给远程用户开 ALL PRIVILEGES ON *.* 等于把数据库完全交出去,一旦密码泄露或应用被攻破,数据就全暴露了。
更稳妥的做法是按最小权限原则,只开放真正需要的库和操作:
- 只读报表需求:
GRANT SELECT ON analytics.* TO 'reporter'@'192.168.1.100'; - 应用写入需求:
GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%'; - 禁止授予
WITH GRANT OPTION,除非你明确需要该用户再给别人授权 - 别忘了执行
FLUSH PRIVILEGES;,否则权限不生效
密码策略强制复杂度,ALTER USER 是必须步骤
MySQL 5.7 默认启用 validate_password 插件,简单密码如 '123456' 或 'password' 会被拒绝,报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
创建用户后如果密码不合规,得立刻改:
- 先查当前策略:
SHOW VARIABLES LIKE 'validate_password%'; - 临时放宽(仅调试):
SET GLOBAL validate_password_length = 6; - 但更推荐直接用强密码创建,或创建后立即修改:
ALTER USER 'remote_user'@'%' IDENTIFIED BY 'A1#b2$c3%D4'; - 注意:MySQL 5.7 不支持
SET PASSWORD语法替代ALTER USER,后者才是标准方式
别忘了检查 bind-address 和防火墙,否则用户建再好也连不上
用户、权限、密码都对了,但连接超时?大概率卡在这两步。
- 确认 MySQL 配置中
bind-address不是127.0.0.1—— 应设为0.0.0.0或注释掉该行 - 配置文件位置通常是
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,改完要systemctl restart mysqld - CentOS 7 默认用
firewalld,开 3306 端口:firewall-cmd --permanent --add-port=3306/tcp,然后firewall-cmd --reload - 如果是 Docker 部署,确保容器启动时加了
--bind-address=0.0.0.0参数,且宿主机端口映射正确
真正容易被忽略的是:即使所有配置都对,host 字段写成 '%' 也不代表能绕过网络层限制——它只管 MySQL 自己的权限判断,底层连不上,它连验证机会都没有。











