Documentation Home

B.3.2.2 无法连接到 [本地] MySQL 服务器

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

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

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

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

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

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

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

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

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

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

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

  • mysqld未在本地主机上运行。检查操作系统的进程列表以确保存在mysqld进程。

  • 你在 Windows 上运行一个 MySQL 服务器,它有许多 TCP/IP 连接。如果您的客户端经常遇到该错误,您可以在此处找到解决方法: 第 B.3.2.2.1 节,“在 Windows 上连接到 MySQL 服务器失败”

  • 有人删除了 mysqld使用的 Unix 套接字文件(/tmp/mysql.sock默认情况下)。例如,您可能有一个从 目录中删除旧文件的cron作业。/tmp您始终可以运行mysqladmin version来检查mysqladmin尝试使用的 Unix 套接字文件是否真的存在。这种情况下的修复是将 cron作业更改为不删除 mysql.sock或将套接字文件放在其他地方。请参阅 第 B.3.3.6 节,“如何保护或更改 MySQL Unix 套接字文件”.

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

    $> netstat -ln | grep mysql

    请参阅第 B.3.3.6 节,“如何保护或更改 MySQL Unix 套接字文件”

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

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

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

  • telnet some_host 3306通过执行并按几次 Enter 键 来检查服务器是否正在该主机上运行。(3306 是默认的 MySQL 端口号。如果您的服务器正在侦听不同的端口,请更改该值。)如果有 MySQL 服务器正在运行并正在侦听该端口,您应该会得到一个包含服务器版本号的响应。如果您收到诸如 之类的错误telnet: Unable to connect to remote host: Connection refused,则说明没有服务器在给定端口上运行。

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

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

B.3.2.2.1 在 Windows 上连接到 MySQL 服务器失败

当您在 Windows 上运行一个带有许多 TCP/IP 连接的 MySQL 服务器时,您经常遇到客户端Can't connect to MySQL server出错的情况,原因可能是 Windows 不允许足够的短暂(短暂)服务于这些连接的端口。

的目的TIME_WAIT是即使在连接关闭后也能保持连接接受数据包。这是因为 Internet 路由可能导致数据包采用缓慢的路由到达目的地,并且可能在双方同意关闭后到达。如果该端口正在用于新连接,则来自旧连接的数据包可能会破坏协议或破坏原始连接中的个人信息。延迟通过 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 注册表中的一些设置(见下文)

重要的

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

  1. 启动注册表编辑器 ( Regedt32.exe)。

  2. 在注册表中找到以下项:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. Edit菜单上,单击Add Value,然后添加以下注册表值:

    Value Name: MaxUserPort
    Data Type: REG_DWORD
    Value: 65534

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

  4. Edit菜单上,单击Add Value,然后添加以下注册表值:

    Value Name: TcpTimedWaitDelay
    Data Type: REG_DWORD
    Value: 30

    TIME_WAIT这设置关闭前 保持 TCP 端口连接状态的秒数。有效范围在 30 到 300 之间(十进制),但您可能希望与 Microsoft 核实最新的允许值。默认值为 0x78(十进制 120)。

  5. 退出注册表编辑器。

  6. 重启机器。

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