#### B.3.2.2 无法连接[当地的]MySQL服务器

[](<>)[](<>)

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

如果 MySQL 服务器在 Windows 上运行，您可以使用 TCP/IP 进行连接。如果服务器以[`命名管道`](server-system-variables.html#sysvar_named_pipe)启用系统变量，如果您在运行服务器的主机上运行客户端，您也可以使用命名管道连接。命名管道的名称是`MySQL`默认。如果您在连接时不提供主机名[**mysqld**](mysqld.html), MySQL 客户端首先尝试连接到命名管道。如果这不起作用，它将连接到 TCP/IP 端口。您可以通过使用强制在 Windows 上使用命名管道`.`作为主机名。

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

错误 (2003)`无法在 '* 上连接到 MySQL 服务器`服务器`*' (10061)`表示网络连接已被拒绝。您应该检查是否有一台 MySQL 服务器正在运行，它是否启用了网络连接，并且您指定的网络端口是服务器上配置的端口。

首先检查是否有一个名为的进程[**mysqld**](mysqld.html)在您的服务器主机上运行。（采用**ps xa | grep mysqld**在Unix上或Windows上的任务管理器上。）如果没有这样的过程，你应该启动服务器。看见[第2.10.2节“启动服务器”](starting-server.html).

如果[**mysqld**](mysqld.html)进程正在运行，您可以通过尝试以下命令进行检查。安装中的端口号或Unix套接字文件名可能不同。`主持人(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
```

注意使用反勾号，而不是带有**主机名**命令这些导致了**主机名**（即当前主机名）替换为[**mysqladmin**](mysqladmin.html)命令如果你没有**主机名**命令或在Windows上运行时，可以在`-h`选项你也可以试试`-h 127.0.0.1`使用TCP/IP连接到本地主机。

确保服务器未配置为忽略网络连接，或者（如果您试图远程连接）未配置为仅在其网络接口上本地侦听。如果服务器是用[`跳过网络`](server-system-variables.html#sysvar_skip_networking)启用系统变量后，它根本无法接受TCP/IP连接。如果服务器是用[`绑定地址`](server-system-variables.html#sysvar_bind_address)系统变量设置为`127.0.0.1`，它只在环回接口上本地侦听TCP/IP连接，不接受远程连接。

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

这里有一些原因`无法连接到本地MySQL服务器`可能会发生以下错误：

-   [**mysqld**](mysqld.html)未在本地主机上运行。检查操作系统的进程列表以确保[**mysqld**](mysqld.html)过程是存在的。

-   您正在Windows上运行一个MySQL服务器，它有许多TCP/IP连接。如果您的客户经常遇到这种错误，您可以在这里找到解决方法：[B.3.2.2.1节，“在Windows上连接MySQL服务器失败”](can-not-connect-to-server.html#can-not-connect-to-server-on-windows).

-   有人删除了[**mysqld**](mysqld.html)使用(`/tmp/mysql。短袜`默认情况下）。例如，你可能有一个**克朗**从数据库中删除旧文件的作业`/tmp`目录你随时都可以跑步[**mysqladmin版本**](mysqladmin.html)检查Unix套接字文件是否[**mysqladmin**](mysqladmin.html)试图使用的东西真的存在。这种情况下的解决方法是更改**克朗**不删除的工作`mysql。短袜`或者将套接字文件放在其他地方。看见[B.3.3.6节，“如何保护或更改MySQL Unix套接字文件”](problems-with-mysql-sock.html).

-   你已经开始了[**mysqld**](mysqld.html)服务器与[`--socket=/path/to/socket`](server-options.html#option_mysqld_socket)选项，但忘记告诉客户端程序套接字文件的新名称。如果更改服务器的套接字路径名，还必须通知MySQL客户端。您可以通过提供相同的[`--插座`](connection-options.html#option_general_socket)运行客户端程序时的选项。您还需要确保客户端有权访问`mysql。短袜`文件要查找套接字文件的位置，可以执行以下操作：

    ```
    $> netstat -ln | grep mysql
    ```

    看见[B.3.3.6节，“如何保护或更改MySQL Unix套接字文件”](problems-with-mysql-sock.html).

-   您正在使用Linux，一个服务器线程已死亡（转储内核）。在这种情况下，你必须杀死另一个[**mysqld**](mysqld.html)线程（例如[**杀死**](kill.html))在重启MySQL服务器之前。看见[B.3.3.3节，“如果MySQL持续崩溃，该怎么办”](crashing.html).

-   服务器或客户端程序可能没有对保存Unix套接字文件或套接字文件本身的目录的适当访问权限。在这种情况下，您必须更改目录或套接字文件的访问权限，以便服务器和客户端可以访问它们，或者重新启动[**mysqld**](mysqld.html)用一个[`--插座`](server-options.html#option_mysqld_socket)选项，指定服务器可以在其中创建套接字文件以及客户端程序可以在其中访问它的目录中的套接字文件名。

    如果你收到错误信息`无法连接到某个主机上的MySQL服务器`，您可以尝试以下方法来找出问题所在：

-   通过执行以下命令检查服务器是否在该主机上运行`telnet主机3306`按几次回车键。（3306是默认的MySQL端口号。如果服务器正在侦听其他端口，请更改该值。）如果有一台MySQL服务器正在运行并监听端口，您应该会得到一个包含服务器版本号的响应。如果出现如下错误：`telnet:无法连接到远程主机：连接被拒绝`，则给定端口上没有运行服务器。

-   如果服务器在本地主机上运行，请尝试使用[**mysqladmin-h localhost变量**](mysqladmin.html)使用Unix套接字文件进行连接。验证服务器配置为侦听的TCP/IP端口号（它是[`港口城市`](server-system-variables.html#sysvar_port)变量。）

-   如果您在Linux下运行，并且启用了安全增强型Linux（SELinux），请参阅[第6.7节“SELinux”](selinux.html).

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

当你在Windows上运行一个MySQL服务器，并且有很多TCP/IP连接时，你会发现你的客户端经常会收到`无法连接到MySQL服务器`错误，原因可能是Windows不允许有足够的临时（短期）端口为这些连接提供服务。

目的`等一下`是指即使在连接关闭后仍保持一个接受数据包的连接。这是因为互联网路由可能会导致数据包缓慢地到达目的地，并且可能在双方同意关闭后到达。如果端口用于新连接，则来自旧连接的数据包可能会破坏协议或泄露原始连接的个人信息。这个`等一下`延迟通过确保端口在允许延迟数据包到达一段时间后才能重新使用来防止这种情况。

减少风险是安全的`等一下`在局域网连接上非常重要，因为数据包不太可能以很长的延迟到达，因为它们可以通过互联网进行传输，而互联网具有相对较大的距离和延迟。

Windows允许用户使用短暂的TCP端口。在任何港口关闭后，它仍处于一个安全状态`等一下`状态为120秒。在此时间到期之前，端口将不再可用。端口号的默认范围取决于Windows的版本，旧版本的端口数更为有限：

-   Windows到Server 2003：端口范围在1025到5000之间

-   Windows Vista、Server 2008及更新版本：端口范围为49152–65535

    一小堆可用的TCP端口（5000个）和大量的TCP端口在短时间内随着`等一下`状态你很有可能用完端口。有两种方法可以解决这个问题：

-   尽可能通过调查连接池或持久连接来快速减少TCP端口的消耗

-   调整Windows注册表中的一些设置（见下文）

重要的

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

1.  启动注册表编辑器(`注册号32。exe`).

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

    ```
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    ```

3.  上`编辑`菜单，点击`增值`，然后添加以下注册表值：

    ```
    Value Name: MaxUserPort
    Data Type: REG_DWORD
    Value: 65534
    ```

    这将设置可供任何用户使用的临时端口数。有效范围在5000到65534（十进制）之间。默认值为0x1388（5000十进制）。

4.  上`编辑`菜单，点击`增值`，然后添加以下注册表值：

    ```
    Value Name: TcpTimedWaitDelay
    Data Type: REG_DWORD
    Value: 30
    ```

    这将设置在中保持TCP端口连接的秒数`等一下`在结束前陈述。有效范围在30到300十进制之间，不过您可能希望向Microsoft查询最新的允许值。默认值为0x78（120十进制）。

5.  退出注册表编辑器。

6.  重启机器。

    注意：撤销上述操作应该和删除您创建的注册表项一样简单。
