必须修改bind-address为0.0.0.0(或指定ip),否则mysql不监听外网请求;还需配置用户host为%、开放3306端口、禁用skip-networking,并重启服务验证。

bind-address 必须改,否则 MySQL 根本不听外网请求
MySQL 默认配置是 bind-address = 127.0.0.1,它只监听本地回环地址——哪怕用户权限全开了、防火墙也放行了,远程连接照样被拒绝,因为请求压根没进 MySQL 进程。
修改位置取决于发行版:
- Ubuntu/Debian:编辑
/etc/mysql/mysql.conf.d/mysqld.cnf - CentOS/RHEL:编辑
/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf
在 [mysqld] 段下找到或添加:
bind-address = 0.0.0.0
如果只要局域网访问(比如仅允许 192.168.1.0/24),可写成:
bind-address = 192.168.1.100
⚠️ 注意:skip-networking = ON 必须删掉或设为 OFF;改完必须重启服务:
- Ubuntu/Debian:
sudo systemctl restart mysql - CentOS/RHEL:
sudo systemctl restart mysqld
验证是否生效:
sudo ss -tlnp | grep :3306
输出里必须出现 0.0.0.0:3306 或你指定的 IP,而不是只有 127.0.0.1:3306。
user 表里的 Host 字段才是远程开关,不是密码或用户名
MySQL 的权限模型中,'root'@'localhost' 和 'root'@'%' 是两个完全独立的账号。只改密码、不改 Host,远程照样连不上。
登录 MySQL 后执行:
USE mysql;<br>SELECT User, Host FROM user WHERE User = 'root';
如果结果里没有 % 或具体远程 IP,说明没开入口。推荐做法是新建专用用户(尤其 MySQL 8.0+):
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
CREATE USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';<br>GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'%';<br>FLUSH PRIVILEGES;
⚠️ 关键点:
- MySQL 8.0 默认认证插件是
caching_sha2_password,很多旧客户端(如某些 Python MySQL 驱动、老版 Navicat)不兼容,所以显式指定mysql_native_password - 别直接改
root的Host,容易引发本地管理失效(比如sudo mysql失败) - 用
'%'是最简方式,但生产环境建议限定 IP 段,如'app_user'@'192.168.1.%'
ufw / firewalld 和云安全组必须同步放行 3306
即使 MySQL 配置全对,网络层卡住就等于白配。这是最容易漏的环节。
本地防火墙操作:
- Ubuntu(ufw):
sudo ufw allow 3306/tcp - CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload
云服务器(阿里云、腾讯云、AWS 等)必须额外配置安全组规则,开放入方向(Inbound)TCP 3306 端口,并设置源 IP 范围(如 0.0.0.0/0 开放全部,或限制为办公 IP)。
测试前先确认端口通不通:
telnet your_server_ip 3306
如果连接超时或拒绝,问题一定出在网络层,不用再查 MySQL 配置。
MySQL 8.0+ 的默认 root 认证方式会静默导致连接失败
MySQL 5.7 及以前,root 用户默认用 mysql_native_password;而 MySQL 8.0+ 改为 caching_sha2_password。这个改动不会报错提示,但远程客户端常表现为“Access denied”或“Authentication plugin 'caching_sha2_password' cannot be loaded”。
解决方法分两种:
- 创建新用户时强制指定插件(前面已提):
IDENTIFIED WITH mysql_native_password BY 'xxx' - 若必须用
root远程,先登录本地 MySQL 执行:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_real_password';<br>FLUSH PRIVILEGES;
注意:'root'@'%' 和 'root'@'localhost' 是两条记录,改前者不影响本地 sudo mysql 使用;但如果你之前没建过 'root'@'%',得先 CREATE USER 再 ALTER。
真正麻烦的是,有些客户端(比如某些嵌入式工具或旧 shell 脚本)根本不支持指定插件,只能靠服务端降级兼容——这意味着你得确认所有使用方的能力边界,不能只看 MySQL 是否“能连上”。










