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 服务器 (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 上失败”。
有人删除了 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
您正在使用 Linux,并且一个服务器线程已死机(转储核心)。在这种情况下,您必须先终止其他 mysqld 线程(例如,使用 kill),然后才能重新启动 MySQL 服务器。请参阅 第 B.3.3.3 节“如果 MySQL 不断崩溃该怎么办”。
服务器或客户端程序可能对保存 Unix 套接字文件的目录或套接字文件本身没有适当的访问权限。在这种情况下,您必须更改目录或套接字文件的访问权限,以便服务器和客户端可以访问它们,或者使用 mysqld 选项重新启动
--socket
,该选项指定服务器可以在其中创建套接字文件且客户端程序可以访问该文件的目录中的套接字文件名。
如果您收到错误消息 无法连接到 some_host 上的 MySQL 服务器
,您可以尝试以下操作来找出问题所在
通过执行
telnet some_host 3306
并按几次 Enter 键来检查服务器是否在该主机上运行。(3306 是默认的 MySQL 端口号。如果您的服务器正在侦听不同的端口,请更改该值。)如果 MySQL 服务器正在运行并侦听该端口,您应该会收到包含服务器版本号的响应。如果您收到诸如telnet: 无法连接到远程主机: 连接被拒绝
之类的错误,则表示在给定端口上没有服务器正在运行。如果服务器正在本地主机上运行,请尝试使用 mysqladmin -h localhost variables 通过 Unix 套接字文件进行连接。验证服务器配置为侦听的 TCP/IP 端口号(它是
port
变量的值)。如果您在 Linux 下运行并且启用了安全增强型 Linux (SELinux),请参阅第 8.7 节,“SELinux”。
当您在 Windows 上运行 MySQL 服务器并与其建立许多 TCP/IP 连接时,并且您经常遇到客户端收到 无法连接到 MySQL 服务器
错误,原因可能是 Windows 不允许使用足够的临时(短暂)端口来为这些连接提供服务。
TIME_WAIT
的目的是即使在连接关闭后仍保持连接接受数据包。这是因为 Internet 路由可能会导致数据包采用缓慢的路由到达其目的地,并且它可能会在双方都同意关闭连接后到达。如果该端口正在用于新连接,则来自旧连接的该数据包可能会破坏协议或泄露原始连接中的个人信息。TIME_WAIT
延迟通过确保在允许这些延迟数据包到达之前的一段时间内无法重复使用该端口来防止这种情况发生。
在局域网连接上大幅减少 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/。
启动注册表编辑器 (
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)。退出注册表编辑器。
重新启动机器。
注意:撤消上述操作应该像删除您创建的注册表项一样简单。