为什么 MySQL 服务器不尊重 bind_address?

为什么 MySQL 服务器不尊重 bind_address?

背景

我正在设置 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 连接,因此它不会tcpnetstat输出中显示单独的套接字,但仍可以使用 IPv4。

相关内容