文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  无法连接到 [本地] MySQL 服务器

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

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

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

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

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

首先检查服务器主机上是否运行名为 mysqld 的进程。(在 Unix 上使用 ps xa | grep mysqld,或者在 Windows 上使用任务管理器。)如果不存在这样的进程,则应启动服务器。请参阅 第 2.9.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 命令一起使用;这些会导致 hostname 的输出(即当前主机名)被替换到 mysqladmin 命令中。如果您没有 hostname 命令或在 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 节,“连接到 MySQL 服务器在 Windows 上失败”

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

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

    $> netstat -ln | grep mysql

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

  • 您正在使用 Linux,并且一个服务器线程已死(转储核心)。在这种情况下,您必须在重新启动 MySQL 服务器之前杀死其他 mysqld 线程(例如,使用 kill)。请参阅 第 B.3.3.3 节,“如果 MySQL 一直崩溃该怎么办”

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

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

  • 通过执行 telnet some_host 3306 并按几次回车键来检查服务器是否在该主机上运行。(3306 是默认的 MySQL 端口号。如果您的服务器正在监听其他端口,请更改该值。)如果有一个 MySQL 服务器正在运行并监听该端口,您应该收到一个包含服务器版本号的响应。如果您收到类似 telnet: Unable to connect to remote host: Connection refused 的错误,则表示该端口上没有运行服务器。

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

  • 如果您在 Linux 上运行并且启用了 Security-Enhanced Linux (SELinux),请参阅 第 8.7 节,“SELinux”

B.3.2.2.1 Windows 上无法连接到 MySQL 服务器

当您在 Windows 上运行一个 MySQL 服务器,并且有很多 TCP/IP 连接到它时,如果您的客户端经常出现 Can't connect to MySQL server 错误,原因可能是 Windows 不允许足够多的短暂(短寿命)端口来为这些连接提供服务。

TIME_WAIT 的作用是在连接关闭后仍保持连接接受数据包。这是因为互联网路由会导致数据包以缓慢的路线到达目的地,并且它可能在双方都同意关闭后到达。如果端口被用于新的连接,则来自旧连接的数据包可能会破坏协议或泄露来自原始连接的个人信息。TIME_WAIT 延迟通过确保端口在允许那些延迟的数据包到达之前不能被重用,从而防止这种情况。

在 LAN 连接上大幅度缩短 TIME_WAIT 是安全的,因为几乎没有数据包在很长时间后到达的可能性,因为它们可能会通过互联网到达,而互联网的距离和延迟相对较大。

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

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

  5. 退出注册表编辑器。

  6. 重新启动计算机。

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