MySQL 5.7+ 需设 bind-address=:: 才启用 IPv6 双栈,此时仅创建一个 AF_INET6 socket(IPV6_V6ONLY=0),同时处理 IPv4/IPv6 连接;需同步放行防火墙、云安全组 IPv6 规则,并用方括号格式连接。

MySQL 默认不监听 IPv6 地址,bind-address=0.0.0.0 只管 IPv4
直接把 bind-address 设成 0.0.0.0,MySQL 会绑定到所有 IPv4 接口,但**完全不监听 IPv6 的 :: 地址**。哪怕系统开了 IPv6、网卡有 IPv6 地址、netstat -tuln 看不到 :::3306,就是没起来。这不是配置遗漏,是 MySQL 5.7 及以前版本的硬限制:它用的是 AF_INET socket,压根不创建 IPv6 socket。
MySQL 5.7+ 需显式启用 IPv6 支持并设 bind-address=::
从 MySQL 5.7 开始支持双栈,但必须同时满足两个条件:
-
bind-address必须设为::(不是0.0.0.0,也不是空值),这是触发双栈监听的关键开关 - 确保
skip-networking未启用,且 mysqld 启动时没加--skip-networking - 如果启用了
mysqlx(X Protocol),它的绑定行为独立,需额外配mysqlx-bind-address
配置示例(/etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld] bind-address = :: # 可选:显式关闭 skip-name-resolve 避免反向 DNS 拖慢 IPv6 连接 skip-name-resolve = ON
验证是否真正监听 IPv6:别只看 netstat,要连通测试
netstat -tuln | grep :3306 显示 :::3306 仅说明 socket 创建成功,不代表能连。常见卡点:
- 防火墙(
ip6tables或nftables)默认丢弃新连接,需放行tcp dpt:3306 - 云厂商安全组(如 AWS SG、阿里云 ECS 安全组)需单独开 IPv6 入方向规则,IPv4 规则不自动覆盖 IPv6
- 客户端用 IPv6 连接时,必须用方括号包裹地址:
mysql -h '::1' -P 3306 -u root或mysql -h '[2001:db8::1]' -P 3306 - 某些老版本客户端(如 MySQL 5.6 客户端)解析
[::1]失败,建议升级客户端或用mysql --protocol=TCP -h ::1
bind-address=:: 的实际监听行为:双栈 ≠ 两个 socket
设 bind-address = :: 后,Linux 上 MySQL 实际只创建一个 AF_INET6 socket,并开启 IPV6_V6ONLY=0(内核默认),从而让该 socket 同时接收 IPv4 和 IPv6 连接(IPv4-mapped IPv6 addresses)。这意味着:
-
netstat -tuln只看到:::3306,看不到*:3306—— 这是正常现象,不是漏配 -
SHOW VARIABLES LIKE 'bind_address';仍显示::,不会变成*或ALL - 若强制要求分离监听(比如 IPv4 走一个端口、IPv6 走另一个),MySQL 不支持,得靠前端代理(如 HAProxy)分流
IPv6 双栈支持的坑不在配置语法,而在网络栈、防火墙、客户端三者的协同。少一个环节,:: 就只是个摆设。


















