• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 无法连接到[本地] MySQL服务器

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

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

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

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

    首先检查服务器主机上是否正在运行名为mysqld的进程。(在Unix上使用ps xa | grep mysqld或在Windows上使用“任务管理器”。)如果没有这样的过程,则应启动服务器。请参见“启动服务器”。

    如果正在运行mysqld进程,则可以通过尝试以下命令进行检查。端口号或Unix套接字文件名在您的设置中可能有所不同。host_ip表示运行服务器的计算机的IP地址。

    shell>mysqladmin version
    shell>mysqladmin variables
    shell>mysqladmin -h `hostname` version variables
    shell>mysqladmin -h `hostname` --port=3306 version
    shell>mysqladmin -h host_ip version
    shell>mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version
    

    请注意,在hostname命令中使用反引号而不是正引号。这些导致主机名(即当前主机名)的输出被替换为mysqladmin命令。如果没有主机名命令或在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上运行具有许多TCP / IP连接的MySQL服务器。如果您的客户端经常遇到此错误,则可以在此处找到一种解决方法:第B.4.2.2.2节“在Windows上与MySQL服务器的连接失败”。
    • 有人删除了mysqld使用的Unix套接字文件(/tmp/mysql.sock默认情况下)。例如,您可能有一个cron作业,该作业从/tmp目录中删除了旧文件。您始终可以运行mysqladmin版本来检查mysqladmin试图使用的Unix套接字文件是否确实存在。在这种情况下,解决方法是更改cron作业以不删除它mysql.sock或将套接字文件放置在其他位置。请参见第B.4.3.6节“如何保护或更改MySQL Unix套接字文件”。
    • 您已经使用该选项启动了mysqld服务器--socket=/path/to/socket,但是却忘记了告诉客户端程序套接字文件的新名称。如果更改服务器的套接字路径名,则还必须通知MySQL客户端。您可以通过--socket在运行客户端程序时提供相同的选项来执行此操作。您还需要确保客户端具有访问mysql.sock文件的权限。要找出套接字文件在哪里,您可以执行以下操作:

      shell>netstat -ln | grep mysql
      

      请参见第B.4.3.6节“如何保护或更改MySQL Unix套接字文件”。

    • 您正在使用Linux,并且一个服务器线程已死亡(转储核心)。在这种情况下,必须先终止其他mysqld线程(例如,使用kill),然后才能重新启动MySQL服务器。请参见第B.4.3.3节“如果MySQL继续崩溃,该怎么办”。
    • 服务器或客户端程序对于拥有Unix套接字文件或套接字文件本身的目录可能没有适当的访问特权。在这种情况下,您必须更改目录或套接字文件的访问权限,以便服务器和客户端可以访问它们,或者使用在服务器可以在其中创建目录的目录中指定套接字文件名的选项重新启动mysqld--socket客户端程序可以访问它。

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

    • 通过执行telnet some_host 3306几次并按Enter键,检查服务器是否在该主机上运行。(3306是默认的MySQL端口号。如果您的服务器正在侦听另一个端口,请更改该值。)如果有一个MySQL服务器正在运行并且正在侦听该端口,则您应该得到一个包含服务器版本号的响应。如果出现诸如之类的错误telnet: Unable to connect to remote host: Connection refused,则说明给定端口上没有服务器在运行。
    • 如果服务器在本地主机上运行,请尝试使用mysqladmin -h localhost变量使用Unix套接字文件进行连接。验证服务器配置为侦听的TCP / IP端口号(这是port变量的值。)
    • 如果您在Linux下运行,并且启用了安全性增强的Linux(SELinux),请参见第B.4.2.2.1节“为MySQL Server设置SELinux上下文”。

    B.4.2.2.1为MySQL服务器设置SELinux上下文

    MySQL服务器读取和写入许多文件,如果在这些文件上未正确设置SELinux上下文,则mysqld进程可能会阻止对MySQL文件的访问。在某些情况下,这可能会阻止mysqld记录错误。

    必备工具

    本指南中使用semanage二进制文件来管理上下文。在Enterprise Linux上,它是policycoreutils-python软件包的一部分:

    shell>yum install policycoreutils-python
    
    注意

    RHEL 6和Python 2.6:要在早期版本的RHEL 6和python 2.6中使用管理,您可能需要使用EPEL存储库中的python-pip安装OrderedDict python收集模块的反向端口。

    列出当前的MySQL上下文

    使用以下命令列出它们:

    shell>semanage fcontext -l | grep -i mysql
    
    设置MySQL数据目录上下文

    默认数据目录位置为/var/lib/mysql/;并且使用的SELinux上下文是mysqld_db_t

    如果您编辑配置文件以在数据目录或数据目录中通常使用的任何文件(例如二进制日志)中使用其他位置,则可能需要为新位置设置上下文。例如:

    shell>semanage fcontext -a -t mysqld_db_t "/path/to/my/custom/datadir(/.*)?"
    shell>restorecon -Rv /path/to/my/custom/datadir
    
    shell>semanage fcontext -a -t mysqld_db_t "/path/to/my/custom/logdir(/.*)?"
    shell>restorecon -Rv /path/to/my/custom/logdir
    
    设置MySQL错误日志文件上下文

    RedHat RPM的默认位置是/var/log/mysqld.log;并且使用的SELinux上下文是mysqld_log_t

    如果您编辑配置文件以使用其他位置,则可能需要为新位置设置上下文。例如:

    shell>semanage fcontext -a -t mysqld_log_t "/path/to/my/custom/error.log"
    shell>restorecon -Rv /path/to/my/custom/error.log
    
    设置PID文件上下文

    PID文件的默认位置是/var/run/mysqld/mysqld.pid;并且使用的SELinux上下文是mysqld_var_run_t

    如果您编辑配置文件以使用其他位置,则可能需要为新位置设置上下文。例如:

    shell>semanage fcontext -a -t mysqld_var_run_t "/path/to/my/custom/pidfile/directory/.*?"
    shell>restorecon -Rv /path/to/my/custom/pidfile/directory
    
    设置unix域套接字上下文

    Unix域套接字的默认位置是/var/lib/mysql/mysql.sock;并且使用的SELinux上下文是mysqld_var_run_t

    如果您编辑配置文件以使用其他位置,则可能需要为新位置设置上下文。例如:

    shell>semanage fcontext -a -t mysqld_var_run_t "/path/to/my/custom/mysql\.sock"
    shell>restorecon -Rv /path/to/my/custom/mysql.sock
    
    设置TCP端口上下文

    默认的TCP端口是3306;并且使用的SELinux上下文是mysqld_port_t

    如果您将mysqld配置为使用其他TCP port,或者启用了诸如组复制之类的功能,这些功能使用了诸如33061(由配置group_replication_local_address)之类的其他端口,则可能需要为新端口设置上下文。如果未在SELinux中正确配置端口,则MySQL功能可能无法正常运行。例如打开端口33061:

    shell>semanage port -a -t mysqld_port_t -p tcp 33061
    shell>restorecon
    
    设置secure_file_priv目录上下文

    适用于5.5.53、5.6.34、5.7.16和8.0.11之后的MySQL版本。

    安装MySQL服务器RPM会创建一个/var/lib/mysql-files/目录,但不会在该目录上设置SELinux上下文。该目录旨在用于诸如之类的操作SELECT ... INTO OUTFILE

    如果通过设置启用了使用此目录secure_file_priv,则可能需要这样设置上下文:

    shell>semanage fcontext -a -t mysqld_db_t "/var/lib/mysql-files/(/.*)?"
    shell>restorecon -Rv /var/lib/mysql-files
    

    如果使用其他位置,请编辑此路径。为了安全起见,此目录绝对不能位于数据目录内。

    有关此变量的更多信息,请参见secure_file_priv文档。

    B.4.2.2.2 Windows上与MySQL服务器的连接失败

    当您在Windows上运行具有许多TCP / IP连接的MySQL服务器时,您经常会遇到客户端Can't connect to MySQL server出错的原因,原因可能是Windows不允许短暂的(短暂的)服务这些连接的端口。

    的目的TIME_WAIT是使连接即使在关闭后也能接受数据包。这是因为Internet路由会导致数据包沿慢速路由到达其目的地,并且可能在双方同意关闭后才到达。如果该端口用于新连接,则旧连接中的该数据包可能会破坏协议或破坏原始连接中的个人信息。该TIME_WAIT延迟防止这种通过确保端口不能到一些时间已经允许的数据包延迟到达后可重复使用。

    可以安全地TIME_WAIT大大减少LAN连接,因为数据包到达非常长的延迟的可能性很小,因为它们可以通过具有较大距离和延迟的Internet进行传输。

    Windows允许用户使用短暂的(短命的)TCP端口。关闭任何端口后,它将保持TIME_WAIT120秒的状态。在此时间到期之前,该端口将不再可用。端口号的默认范围取决于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
      

      设置TIME_WAIT关闭前将TCP端口连接保持在状态的秒数。有效范围是十进制的30到300,尽管您可能希望与Microsoft联系以获取最新的允许值。默认值为0x78(十进制120)。

    5. 退出注册表编辑器。
    6. 重新启动机器。

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