背景
我正在设置 MySQL 服务器。其配置文件 (my.cnf) 没有该bind_address
选项。据我了解其文档,其值默认*
为应该使服务器监听所有 IPv4 或 IPv6 地址。
问题
当我启动 MySQL 服务器时,我希望它监听 IPv4。相反,正如我在下面检查的那样,它只监听 IPv6。
$ netstat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp6 0 0 :::33060 :::* LISTEN
tcp6 0 0 :::3306 :::* LISTEN
# -- snip --
为什么会发生这种情况?我该如何让 MySQL 服务器监听 IPv4 地址?
到目前为止我已经检查过:
- 我确保没有其他配置文件会无意中覆盖
bind_address
。当我查询 时SELECT @@bind_address
,它会*
按预期正确显示。 - 我确认我的系统上配置了 IPv4 网络。运行
ip addr show
显示eth0
已分配 IPv4 地址。事实上,我不认为我的系统配置了 IPv6,因为我没有看到任何inet
带有 IPv6 的系统。 - 当我
bind_address=0.0.0.0
在 my.cnf 中明确设置然后重新启动服务器时,服务器仍然监听 IPv6 地址,显示netstat
上述相同的输出。 - 我的系统上没有运行其他 MySQL 服务器实例。
环境
- MySQL 服务器:v8.0.36
- 操作系统:CentOS 7
答案1
您链接的文档中的引用:
如果地址为 *,则服务器接受所有服务器主机 IPv4 接口上的 TCP/IP 连接,如果服务器主机支持 IPv6,则接受所有 IPv6 接口上的 TCP/IP 连接。使用此地址允许所有服务器接口上的 IPv4 和 IPv6 连接。此值为默认值。
默认情况下,在 Linux 上监听 IPv6 套接字也会接受 IPv4 连接,因此它不会tcp
在netstat
输出中显示单独的套接字,但仍可以使用 IPv4。