bind-address必须设为具体ipv4地址(如192.168.1.100),不可带引号、空格或通配符;mysql 8.0.13+支持逗号分隔的多ip列表,但各ip须真实存在且已配置在网卡上。

bind-address 必须写成具体 IPv4 地址,不能带引号或空格
MySQL 8.0 的 bind-address 只接受纯数字 IPv4 地址(如 192.168.1.100),不支持 "192.168.1.100"、192.168.1.100 (尾部空格)、localhost 或 CIDR 表示法。写错会导致 mysqld 启动失败,日志里出现 Invalid argument 或 unknown variable 'bind-address=...'。
必须确保该 IP 已实际配置在某块网卡上:ip addr show 能查到它;否则 MySQL 可能静默回退到 127.0.0.1,或者启动报错。
- 编辑配置文件(如
/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]段下添加:bind-address = 192.168.1.100 - 确认没有其他配置覆盖它:检查是否有多个
[mysqld]段、或!include引入的额外文件 - 重启服务:
sudo systemctl restart mysql,不要只 reload
监听指定 IP 后,localhost 连接会失效
设成 bind-address = 192.168.1.100 意味着 MySQL 只绑定那块网卡,不再监听 127.0.0.1 —— 即使本机用 mysql -h 127.0.0.1 -u root 也会被拒绝,因为 TCP 请求发到了回环接口,而服务根本没在那里监听。
常见翻车场景:
- 运维脚本或监控工具硬编码了
-h 127.0.0.1,突然连不上 - Docker 容器内应用通过宿主机 IP 连,但容器网络无法路由到该内网 IP(比如桥接模式下只能走
host.docker.internal) - 想同时支持本地调试和内网访问,却误以为 bind-address 能“多选”
解决办法只有两个:要么改应用连接地址为该 IP,要么放弃指定 IP、改用 bind-address = 0.0.0.0 + 用户权限控制(见下一条)。
MySQL 8.0.13+ 才支持 bind-address 多 IP 列表
如果你用的是 MySQL 8.0.13 或更高版本,且必须监听多个确定 IP(比如 192.168.1.100 和 10.0.2.15),可以写成逗号分隔列表:
bind-address = 192.168.1.100,10.0.2.15
但注意:
- 列表中不能含通配符:
0.0.0.0、*、::都非法 - 每个 IP 必须真实存在且已配置在对应网卡上
- 低于 8.0.13 的版本(包括绝大多数生产环境部署的 8.0.2x/8.0.3x,默认仍不启用此特性)不识别该语法,会直接启动失败
- 运行
SELECT VERSION();确认版本,再查官方文档确认是否启用该功能
验证监听是否真生效,别信配置文件写了就完事
改完配置、重启服务后,唯一可信的验证方式是看系统级 socket 监听状态:
sudo ss -tlnp | grep :3306
你期望看到的是:
LISTEN 0 70 192.168.1.100:3306 *:* users:(("mysqld",pid=12345,fd=32))
而不是:
-
*:3306→ 实际监听了所有接口(bind-address = 0.0.0.0或未生效) -
127.0.0.1:3306→ 配置没加载成功,可能段落位置错、文件路径错、或被skip-networking = ON覆盖 - 无输出 → mysqld 没起来,查
journalctl -u mysql -n 50 -e
特别容易被忽略的一点:Docker 或 systemd 环境下,MySQL 进程可能读取的是容器内部或 service unit 指定的配置路径,不是你编辑的那个文件。











