B.3.2.2 无法连接到[本地] MySQL 服务器
Unix 客户端可以以两种方式连接到mysqld 服务器:使用文件系统中的 Unix 套接字文件(默认/tmp/mysql.sock
),或使用 TCP/IP,连接到端口号。Unix 套接字文件连接速度更快,但只能用于连接同一台计算机上的服务器。如果不指定主机名或指定特殊主机名localhost
,将使用 Unix 套接字文件。
如果 MySQL 服务器在 Windows 上运行,可以使用 TCP/IP 连接。如果服务器启用了named_pipe
系统变量,也可以使用命名管道连接,如果客户端在服务器所在主机上运行。命名管道的名称默认为MySQL
。如果不给出主机名连接到mysqld,MySQL 客户端首先尝试连接命名管道。如果失败,则连接 TCP/IP 端口号。可以在 Windows 上强制使用命名管道连接,使用.
作为主机名。
错误(2002)无法连接到 ...
通常意味着系统上没有运行 MySQL 服务器或您在尝试连接服务器时使用了错误的 Unix 套接字文件名称或 TCP/IP 端口号。还应该检查您使用的 TCP/IP 端口号是否被防火墙或端口阻止服务阻止。
错误(2003)Can't connect to MySQL server on '
表示网络连接被拒绝。您应该检查是否有 MySQL 服务器正在运行,是否启用了网络连接,并且指定的网络端口是否是服务器配置的端口。server
' (10061)
首先,检查您的服务器主机上是否存在名为 mysqld 的进程。 (在 Unix 上使用ps xa | grep mysqld,在 Windows 上使用任务管理器。) 如果没有这样的进程,您应该启动服务器。见 第 2.9.2 节,“启动服务器”。
如果存在名为 mysqld 的进程,您可以尝试以下命令。端口号或 Unix 套接字文件名可能在您的设置中不同。host_ip
表示服务器正在运行的机器 IP 地址。
Press CTRL+C to copy$> 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 命令中。如果您没有 hostname 命令或在 Windows 上运行,可以手动输入机器的主机名(不带反引号)后跟 -h
选项。也可以尝试使用 -h 127.0.0.1
连接到本地主机。
确保服务器没有被配置忽略网络连接或(如果您正在远程连接)它没有被配置只在其网络接口上监听。如果服务器使用了 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
错误可能出现的原因:
-
您在Windows上运行了多个TCP/IP连接到它的MySQL服务器。如果您经常遇到客户端出现该错误,可以在这里找到解决方案:第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 客户端程序。您也需要确保客户端可以访问mysql.sock
文件。要找到套接字文件的位置,可以执行:Press CTRL+C to copy$> netstat -ln | grep mysql
-
您使用 Linux,一个服务器线程已经崩溃(coredump)。在这种情况下,您必须杀死其他mysqld 线程(例如,使用kill)然后才能重启 MySQL 服务器。请参见第 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 下运行,并且启用了安全增强型 Linux(SELinux),请查看第8.7节,“SELinux”。
在 Windows 上运行 MySQL 服务器,拥有许多 TCP/IP 连接,并经常出现“无法连接到 MySQL 服务器”错误,那可能是因为 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 注册表设置(见下文)
以下过程涉及修改注册表。修改注册表前,请先备份它,并确保了解恢复方法。如果您不知道如何备份、恢复和编辑注册表,查看 Microsoft 知识库中的文章:http://support.microsoft.com/kb/256986/EN-US/。
-
Regedt32.exe
启动注册表编辑器。 -
在注册表中找到以下键:
Press CTRL+C to copyHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
在
Edit
菜单上,点击Add Value
Press CTRL+C to copyValue Name: MaxUserPort Data Type: REG_DWORD Value: 65534
将可用瞬时端口数量设置为任何用户。有效范围是5000-65534(十进制)。默认值是0x1388(5000十进制)。
-
在
Edit
菜单上,点击Add Value
Press CTRL+C to copyValue Name: TcpTimedWaitDelay Data Type: REG_DWORD Value: 30
将 TCP 端口连接保持在
TIME_WAIT
状态的秒数设置为关闭前。有效范围是30-300(十进制),但您可能需要与 Microsoft 检查最新允许的值。默认值是0x78(120十进制)。 -
退出注册表编辑器。
-
重新启动机器。
注意:取消上述操作只需要删除您创建的注册表项。