B.4.2.2 无法连接到[1] MySQL 服务器

Unix 上的 MySQLClient 端可以通过两种不同的方式连接到mysqld服务器:通过使用 Unix 套接字文件通过文件系统中的文件(默认为/tmp/mysql.sock)进行连接,或者通过使用 TCP/IP(通过端口号进行连接)进行连接。 Unix 套接字文件连接的速度比 TCP/IP 快,但是只能在连接到同一台计算机上的服务器时使用。如果您未指定主机名或指定特殊主机名localhost,则使用 Unix 套接字文件。

如果 MySQL 服务器在 Windows 上运行,则可以使用 TCP/IP 进行连接。如果在启用了named_pipe系统变量的情况下启动服务器,则在运行服务器的主机上运行 Client 端时,也可以使用命名管道进行连接。默认情况下,命名管道的名称为MySQL。如果在连接mysqld时未提供主机名,则 MySQLClient 端会首先尝试连接到命名管道。如果这样不起作用,它将连接到 TCP/IP 端口。您可以通过使用.作为主机名在 Windows 上强制使用命名管道。

错误(2002)Can't connect to ...通常 table 示系统上没有运行 MySQL 服务器,或者在尝试连接到服务器时使用了错误的 Unix 套接字文件名或 TCP/IP 端口号。您还应该检查所使用的 TCP/IP 端口是否未被防火墙或端口阻止服务阻止。

错误(2003)Can't connect to MySQL server on 'server' (10061)table 示网络连接已被拒绝。您应该检查是否有正在运行的 MySQL 服务器,是否已启用网络连接,以及指定的网络端口是否为服务器上配置的端口。

首先检查服务器主机上是否正在运行名为mysqld的进程。 (在 Unix 上使用 ps xa | grep mysqld 或在 Windows 上使用任务 Management 器.)如果没有这样的过程,则应启动服务器。参见第 2.10.2 节“启动服务器”

如果mysqld进程正在运行,则可以通过尝试以下命令进行检查。您的设置中的端口号或 Unix 套接字文件名可能不同。 host_ip代 table 运行服务器的计算机的 IP 地址。

shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h host_ip version
shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

请注意,使用 hostname 命令时要使用反引号而不是使用引号;这些会导致 hostname (即当前主机名)的输出被替换为mysqladmin命令。如果没有 hostname 命令或正在 Windows 上运行,则可以在-h选项后手动键入计算机的主机名(不带反引号)。您也可以尝试-h 127.0.0.1将 TCP/IP 连接到 localhost。

确保未将服务器配置为忽略网络连接,或者(如果您尝试远程连接)未将服务器配置为仅在其网络接口上本地侦听。如果服务器是在启用skip_networking系统变量的情况下启动的,则它将完全不接受 TCP/IP 连接。如果服务器是在bind_address系统变量设置为127.0.0.1的情况下启动的,则它将仅在回送接口上本地侦听 TCP/IP 连接,并且不接受远程连接。

检查以确保没有防火墙阻止对 MySQL 的访问。您的防火墙可以根据正在执行的应用程序或 MySQL 用于通信的端口号进行配置(默认为 3306)。在 Linux 或 Unix 下,检查 IPtable(或类似的配置)以确保端口未被阻塞。在 Windows 下,可能需要配置诸如 ZoneAlarm 或 Windows 防火墙之类的应用程序,以不阻止 MySQL 端口。

以下是可能发生Can't connect to local MySQL server错误的一些原因:

  • mysqld不在 localhost 上运行。检查您 os 的进程列 table,以确保存在mysqld进程。

  • 您正在 Windows 上运行具有许多 TCP/IP 连接的 MySQL 服务器。如果您的 Client 经常遇到此错误,则可以在这里找到解决方法:第 B.4.2.2.1 节,“ Windows 上与 MySQL 服务器的连接失败”

  • 有人删除了mysqld使用的 Unix 套接字文件(默认为/tmp/mysql.sock)。例如,您可能具有 cron 作业,该作业会从/tmp目录中删除旧文件。您始终可以运行mysqladmin version来检查mysqladmin尝试使用的 Unix 套接字文件是否确实存在。在这种情况下,解决方法是更改* cron **作业以不删除mysql.sock或将套接字文件放置在其他位置。参见第 B.4.3.6 节“如何保护或更改 MySQL Unix 套接字文件”

  • 您已经使用--socket=/path/to/socket选项启动了mysqld服务器,但是忘记了告诉 Client 端程序套接字文件的新名称。如果更改服务器的套接字路径名,则还必须通知 MySQLClient 端。您可以通过在运行 Client 端程序时提供相同的--socket选项来实现此目的。您还需要确保 Client 端具有访问mysql.sock文件的权限。要找出套接字文件在哪里,您可以执行以下操作:

shell> netstat -ln | grep mysql

See 第 B.4.3.6 节“如何保护或更改 MySQL Unix 套接字文件”.

  • 您正在使用 Linux,并且一个服务器线程已死亡(转储核心)。在这种情况下,必须先杀死其他mysqld个线程(例如,使用kill),然后才能重新启动 MySQL 服务器。参见第 B.4.3.3 节“如果 MySQLcontinue 崩溃该怎么办”

  • 服务器或 Client 端程序对于拥有 Unix 套接字文件或套接字文件本身的目录可能没有适当的访问特权。在这种情况下,您必须更改目录或套接字文件的访问权限,以便服务器和 Client 端可以访问它们,或者使用--socket选项重新启动mysqld,该选项在服务器可以创建目录的目录中指定套接字文件名,并且 Client 端程序可以访问它的位置。

如果收到错误消息Can't connect to MySQL server on some_host,则可以尝试以下操作以找出问题所在:

  • 通过执行telnet some_host 3306并按两次 Enter 键,检查服务器是否在该主机上运行。 (3306 是默认的 MySQL 端口号.如果您的服务器正在侦听其他端口,请更改该值.)如果有一个 MySQL 服务器正在运行并且正在侦听该端口,则您应该得到一个包含服务器版本号的响应。如果出现诸如_之类的错误,则说明给定端口上没有服务器在运行。

  • 如果服务器在 localhost 上运行,请尝试使用mysqladmin -h 本地变量通过 Unix 套接字文件进行连接。验证服务器配置为侦听的 TCP/IP 端口号(它是port变量的值。)

  • 如果您在 Linux 下运行,并且启用了安全性增强的 Linux(SELinux),请参阅第 6.5 节“ SELinux”

B.4.2.2.1 Windows 上与 MySQL 服务器的连接失败

当您在 Windows 上运行带有许多 TCP/IP 连接的 MySQL 服务器时,您经常会遇到 Client 端出现Can't connect to MySQL server错误的情况,原因可能是 Windows 不允许短暂的(短暂的) )端口以服务那些连接。

TIME_WAIT的目的是使连接即使在关闭后也能接受数据包。这是因为 Internet 路由可能导致数据包沿慢速路由到达其目的地,并且可能在双方同意关闭后才到达。如果端口正在用于新连接,则旧 Connecting 的该数据包可能会破坏协议或破坏原始 Connecting 的个人信息。 TIME_WAIT延迟通过确保在允许这些延迟的数据包到达一段时间后才能重用该端口,来防止此情况。

可以大大减少 LAN 连接上的TIME_WAIT,这是安全的,因为数据包到达非常长的延迟的可能性很小,因为它们可以通过具有较大距离和延迟的 Internet 进行传输。

Windows 允许用户使用短暂的(短命的)TCP 端口。关闭任何端口后,它将保持TIME_WAIT状态 120 秒钟。在此时间到期之前,该端口将不再可用。端口号的默认范围取决于 Windows 的版本,而旧版本中端口的数量有限:

  • Windows 通过 Server 2003:端口范围 1025–5000

  • Windows Vista,Server 2008 和更高版本:端口范围 49152–65535

一小堆可用的 TCP 端口(5000)以及在短时间内打开和关闭大量的 TCP 端口以及TIME_WAIT状态,您很有可能会用尽端口。有两种方法可以解决此问题:

  • 通过在可能的情况下研究连接池或持久连接来减少快速消耗的 TCP 端口数量

  • 调整 Windows 注册 table 中的某些设置(请参见下文)

Important

以下过程涉及修改 Windows 注册 table。修改注册 table 之前,请确保对其进行备份,并确保您了解如果发生问题如何还原它。有关如何备份,还原和编辑注册 table 的信息,请查看 Microsoft 知识库中的以下文章:http://support.microsoft.com/kb/256986/EN-US/

  • 启动注册 table 编辑器(Regedt32.exe)。

  • 在注册 table 中找到以下项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  • Edit菜单上,单击Add Value,然后添加以下注册 table 值:
Value Name: MaxUserPort
Data Type: REG_DWORD
Value: 65534

设置任何用户可用的临时端口数。有效范围是 5000 到 65534(十进制)之间。默认值为 0x1388(十进制 5000)。

  • Edit菜单上,单击Add Value,然后添加以下注册 table 值:
Value Name: TcpTimedWaitDelay
Data Type: REG_DWORD
Value: 30

设置关闭前将 TCP 端口连接保持为TIME_WAIT状态的秒数。有效范围是十进制的 30 到 300,尽管您可能希望向 Microsoft 查询最新的允许值。默认值为 0x78(十进制 120)。

  • 退出注册 table 编辑器。

  • 重新启动机器。

注意:撤消上述操作应与删除已创建的注册 table 项一样简单。