mysql 指定多个IP 绑定监听地址 bind_address

Posted 胖虎是只mao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 指定多个IP 绑定监听地址 bind_address相关的知识,希望对你有一定的参考价值。

bind_address 参数:
其实能否绑定多个IP跟mysql 版本有关系。

MySQL 服务器在一个或多个网络套接字上侦听 TCP/IP 连接。每个套接字绑定到一个地址,但一个地址可以映射到多个网络接口。要指定服务器应如何侦听 TCP/IP 连接,请 bind_address在服务器启动时设置系统变量。服务器还有一个 admin_address系统变量,可以在专用接口上启用管理连接。

1. 如果bind_address指定,其值必须满足以下要求:

  • 在 MySQL 8.0.13 之前, bind_address接受单个地址值,它可以指定单个非通配符 IP 地址或主机名,或允许侦听多个网络接口(、、或)的通配符地址*格式 0.0.0.0之一::。

  • 从 MySQL 8.0.13 开始,bind_address接受刚才描述的单个值或逗号分隔值的列表。当变量命名多个值的列表时,**每个值必须指定一个非通配符 IP 地址(IPv4 或 IPv6)或主机名。**值列表中不允许使用 通配符地址格式(*、 0.0.0.0或)。::
    当多个值的时候,每个值必须是一个确定的IP,不能有通配符。

  • 从 MySQL 8.0.22 开始,地址可能包含网络命名空间说明符。

IP 地址可以指定为 IPv4 或 IPv6 地址。对于作为主机名的任何值,服务器将名称解析为 IP 地址并绑定到该地址。如果主机名解析为多个 IP 地址,则服务器使用第一个 IPv4 地址(如果有),否则使用第一个 IPv6 地址。

2. 服务器处理不同类型的地址如下:

  • 如果地址为*,则服务器在所有服务器主机 IPv4 接口上接受 TCP/IP 连接,如果服务器主机支持 IPv6,则在所有 IPv6 接口上接受 TCP/IP 连接。使用此地址可允许所有服务器接口上的 IPv4 和 IPv6 连接。此值为默认值。如果变量指定了多个值的列表,则不允许使用此值。

  • 如果地址是0.0.0.0,则服务器接受所有服务器主机 IPv4 接口上的 TCP/IP 连接。如果变量指定了多个值的列表,则不允许使用此值。

  • 如果地址是::,则服务器接受所有服务器主机 IPv4 和 IPv6 接口上的 TCP/IP 连接。如果变量指定了多个值的列表,则不允许使用此值。

  • 如果地址是 IPv4 映射地址,则服务器接受该地址的 TCP/IP 连接,采用 IPv4 或 IPv6 格式。例如,如果服务器绑定到::ffff:127.0.0.1,客户端可以使用–host=127.0.0.1或 --host=::ffff:127.0.0.1 进行连接。

  • 如果地址是“常规” IPv4 或 IPv6 地址(例如127.0.0.1或 ::1),则服务器仅接受该 IPv4 或 IPv6 地址的 TCP/IP 连接。

3.这些规则适用于为地址指定网络命名空间:

  • 可以为 IP 地址或主机名指定网络名称空间。

  • 不能为通配符 IP 地址指定网络命名空间。

  • 对于给定的地址,网络命名空间是可选的。如果给定,则必须将其指定为 紧跟地址的后缀。 /ns

  • 没有 后缀的地址使用主机系统全局命名空间。因此全局命名空间是默认的。 /ns

  • 带有 后缀的地址使用名为 ns的命名空间。 /ns

  • 主机系统必须支持网络命名空间,并且每个命名的命名空间都必须事先设置。命名一个不存在的命名空间会产生错误。

  • 如果变量值指定多个地址,它可以包括全局命名空间、命名命名空间或混合中的地址。

如果绑定到任何地址失败,服务器会产生错误并且不会启动。

例子:

bind_address=*
*服务器侦听通配符 指定的所有 IPv4 或 IPv6 地址。

bind_address=198.51.100.20
服务器仅侦听 198.51.100.20IPv4 地址。

bind_address=198.51.100.20,2001:db8:0:f101::1
服务器侦听198.51.100.20 IPv4 地址和2001:db8:0:f101::1 IPv6 地址。

bind_address=198.51.100.20,*
bind_address这会产生错误,因为在命名多个值的列表 时不允许使用通配符地址 。

bind_address=198.51.100.20/red,2001:db8:0:f101::1/blue,192.0.2.50
服务器侦听 red命名空间中的 198.51.100.20 IPv4 地址、blue命名空间中的 2001:db8:0:f101::1IPv6 地址  192.0.2.50全局命名空间中的 IPv4 地址。

实例如下:

当bind_address命名单个值(通配符或非通配符)时,服务器侦听单个套接字,通配符地址可能绑定到多个网络接口。当 bind_address命名多个值的列表时,服务器会侦听每个值的一个套接字,每个套接字都绑定到一个网络接口。套接字的数量与指定的值的数量成线性关系。根据操作系统的连接接受效率,长值列表可能会导致接受 TCP/IP 连接的性能损失。

因为文件描述符是为监听套接字和网络命名空间文件分配的,所以可能需要增加open_files_limit系统变量。

如果您打算将服务器绑定到特定地址,请确保mysql.user系统表包含具有管理权限的帐户,您可以使用该帐户连接到该地址。否则,您无法关闭服务器。例如,如果您将服务器绑定到 *,您可以使用所有现有帐户连接到它。但是,如果您将服务器绑定到 ::1,它只接受该地址上的连接。在这种情况下,首先确保该 ‘root’@'::1’帐户存在于 mysql.user表中,以便您仍然可以连接到服务器以将其关闭。

以上是关于mysql 指定多个IP 绑定监听地址 bind_address的主要内容,如果未能解决你的问题,请参考以下文章

mysql 指定多个IP 绑定监听地址 bind_address

如何修改MySQL监听IP地址

socket中bind函数绑定的IP是啥

MongoDB 访问权限控制

socket编程:bind函数是把socket绑定到具体窗口?

Redis 4.0.14版本的相关参数总结