在 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) 无法连接到 ...
通常意味着系统上没有运行的 MySQL 服务器,或者在尝试连接到服务器时使用了错误的 Unix 套接字文件名或 TCP/IP 端口号。您还应该检查 TCP/IP 端口是否被防火墙或端口阻止服务阻止。
错误 (2003) 无法连接到 MySQL 服务器 '
表示网络连接被拒绝。您应该检查是否有运行的 MySQL 服务器,是否启用了网络连接,并且指定的网络端口是否是服务器上配置的。server
' (10061)
首先,检查服务器主机上是否有名为 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 端口。
以下是 无法连接到本地 MySQL 服务器
错误可能的原因:
-
您在 Windows 上运行 MySQL 服务器,并且有许多 TCP/IP 连接到它。如果您经常遇到客户端出现该错误,可以在这里找到解决方法:第 B.3.2.2.1 节,“连接到 MySQL 服务器在 Windows 上失败”。
-
有人删除了 Unix 套接字文件,mysqld 使用该文件 (
/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
-
您正在使用 Linux,并且一个服务器线程已经死亡(dumped core)。在这种情况下,您必须在重新启动 MySQL 服务器之前杀死其他 mysqld 线程(例如,使用 kill)。请参阅 第 B.3.3.3 节,“如果 MySQL 不断崩溃”。
-
服务器或客户端程序可能没有正确的访问权限来访问 Unix 套接字文件或套接字文件本身。在这种情况下,您必须更改目录或套接字文件的访问权限,以便服务器和客户端可以访问它们,或者使用 mysqld 重新启动,带有
--socket
选项,该选项指定了一个套接字文件名,该文件位于服务器可以创建它并且客户端程序可以访问它的目录中。
如果您收到错误消息 无法连接到 MySQL 服务器 some_host
,您可以尝试以下几件事来查找问题所在:
-
检查服务器是否在该主机上运行,方法是执行
telnet some_host 3306
并按下 Enter 键几次。(3306 是 MySQL 的默认端口号。如果您的服务器监听不同的端口,请更改该值。)如果有 MySQL 服务器正在运行并监听该端口,您应该收到包括服务器版本号的响应。如果您收到错误消息,例如telnet: 无法连接到远程主机: 连接被拒绝
,那么该端口上没有服务器运行。 -
如果服务器在本地主机上运行,请尝试使用 mysqladmin -h localhost variables 连接使用 Unix 套接字文件。验证服务器配置的 TCP/IP 端口号(它是
port
变量的值。) -
如果您在 Linux 下运行并且启用了 Security-Enhanced Linux (SELinux),请参阅 第 8.7 节,“SELinux”。
当您在 Windows 上运行 MySQL 服务器,并且您经常遇到客户端收到 无法连接到 MySQL 服务器
错误时,原因可能是 Windows 不允许足够的短暂端口来服务这些连接。
TIME_WAIT 的目的是在连接关闭后继续保持连接接受数据包。这是因为互联网路由可能会导致数据包通过慢速路由到达目的地,即使双方已经同意关闭连接。如果端口被用于新的连接,那么来自旧连接的数据包可能会破坏协议或泄露原始连接的个人信息。TIME_WAIT 延迟可以防止这种情况,确保端口在延迟一段时间后才能被重新使用,以便延迟的数据包到达。
在局域网连接中,可以安全地大幅减少 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/。
-
启动注册表编辑器(
Regedt32.exe
)。 -
在注册表中定位以下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
在
编辑
菜单上,单击添加值
,然后添加以下注册表值:Value Name: MaxUserPort Data Type: REG_DWORD Value: 65534
这将设置任何用户可用的临时端口数量。有效范围是 5000 到 65534(十进制)。默认值是 0x1388(5000 十进制)。
-
在
编辑
菜单上,单击添加值
,然后添加以下注册表值:Value Name: TcpTimedWaitDelay Data Type: REG_DWORD Value: 30
这将设置 TCP 端口在 TIME_WAIT 状态下的保持时间(秒)。有效范围是 30 到 300 十进制,尽管您可能需要查看 Microsoft 的最新许可值。默认值是 0x78(120 十进制)。
-
退出注册表编辑器。
-
重新启动机器。
注意:撤销上述操作只要删除您创建的注册表条目即可。