mysql 8.0 默认 bind-address=127.0.0.1 是官方明确的安全默认行为,强制仅监听本地回环,拒绝所有外部tcp连接;需改为0.0.0.0或指定ipv4地址并重启服务,同时确认skip-networking已关闭、防火墙及云安全组放行3306端口。

MySQL 8.0 默认 bind-address=127.0.0.1 是安全策略,不是配置遗漏
这不是 bug,也不是安装异常,而是 MySQL 官方二进制包、Docker 镜像、源码编译版的**明确安全默认行为**。它强制服务只响应本机 TCP 请求,从网络层直接切断外部连接可能——连 SYN 包都不收,所以你看到的“连接超时”或“拒绝连接”根本不是认证失败,是压根没走到权限校验那步。
Ubuntu/Debian 的 APT 包例外地设为 0.0.0.0,但这属于发行版定制,并非 MySQL 原生逻辑。别拿 Ubuntu 的表现去推断其他环境。
改 bind-address 前必须确认 skip_networking 是否关闭
即使你把 bind-address 改成 0.0.0.0,如果 skip_networking=ON,MySQL 会彻底禁用 TCP/IP 协议栈,监听地址照样是空的。这个选项优先级高于 bind-address。
- 登录 MySQL 执行:
SELECT @@skip_networking;,返回ON就必须处理 - 在配置文件
[mysqld]段中查找skip-networking或skip_networking,整行注释掉或删掉 - 该参数没有中间状态,ON 就全关,OFF(默认)才启用网络
bind-address 不支持 CIDR 和通配符,写错就启动失败
bind-address = 192.168.1.0/24 或 bind-address = * 这类写法在 MySQL 中非法,会导致 mysqld 启动失败,systemctl status mysql 里能看到类似 unknown variable 'bind-address=192.168.1.0/24' 的错误。
合法值只有三种:
-
127.0.0.1(仅 IPv4 回环) -
0.0.0.0(所有 IPv4 接口) - 服务器某个具体 IPv4 地址,如
192.168.1.100(仅该网卡)
注意:localhost 是无效值,会直接报错退出;IPv6 地址如 ::1 也不被 bind-address 支持(需用 mysqlx_bind_address 单独控制 X Plugin)。
改完配置不重启,等于没改;不验证监听状态,等于白改
修改 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf 后,必须执行:sudo systemctl restart mysql。systemd 可能缓存旧进程,kill -9 手动杀进程再启容易漏掉子进程,不推荐。
验证是否生效,唯一可靠方式是运行:sudo ss -tlnp | grep :3306
- 看到
*:3306或[::]:3306→ 监听全部接口,成功 - 看到
127.0.0.1:3306→ 配置未生效,检查文件路径、段落位置(必须在[mysqld]下)、拼写、是否被其他配置覆盖 - 看不到任何输出 → mysqld 没起来,查
journalctl -u mysql -n 50 -e
云服务器上还得多看一层:安全组是否放行 3306 端口。配置对了、服务起来了、监听也对了,安全组没开,照样连不上——这个环节最容易被当成 MySQL 问题反复折腾。











