【问题标题】:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)无法通过套接字'/var/lib/mysql/mysql.sock'连接到本地MySQL服务器(2)
【发布时间】:2011-05-25 19:26:30
【问题描述】:

当我尝试连接 mysql 时出现以下错误:

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

这个错误有解决办法吗?可能是什么原因?

【问题讨论】:

标签: mysql sockets connect


【解决方案1】:

您是连接到“localhost”还是“127.0.0.1”?我注意到当您连接到“localhost”时,使用了套接字连接器,但是当您连接到“127.0.0.1”时,使用了 TCP/IP 连接器。如果套接字连接器未启用/工作,您可以尝试使用“127.0.0.1”。

【讨论】:

  • 在这种情况下,你应该检查一下你的 MYSQL 服务器是否真的在运行。
  • 您也可以强制使用带有套接字参数的套接字(-S 和 /usr/bin/mysql)并通过提供端口来强制 TCP/IP(-P 和 /usr/bin/mysql. )
  • 使用 localhost 以外的完全限定网络名称对我有用。只需确保它在客户端的“主机”文件中声明即可。
  • cygwin 用户注意:例如,如果 cygwin mysql 客户端尝试连接到本地 WAMP mysql 服务器,请使用 -h 。不要试图创建一个 mysql.sock 文件并在任何 my.cnf 文件中声明它,它不会起作用。
  • 错误的主机名确实给了我完全相同的错误。查看我的 docker 容器中的 /etc/hosts 文件,我发现 MySql 主机名是 mysql。在我的连接配置中使用相同的主机名解决了这个问题。
【解决方案2】:

确保您的 mysql 服务正在运行

service mysqld start

然后,尝试以下方法之一:

(如果你没有设置mysql密码)

mysql -u root

如果你已经设置了密码

mysql -u root -p

【讨论】:

  • 在较新版本的 debian 上:service mariadb start 因为mariadb.org/debian-9-released-mariadb-mysql-variant
  • 给那家伙一枚勋章。
  • 这就是我的答案。由于我使用的是 mariadb,因此解决方案是运行以​​下命令:“sudo systemctl start mariadb”。之后一切都很好。
  • 给@Zahra 一枚勋章
【解决方案3】:

如果您的文件 my.cnf(通常在 etc 文件夹中)配置正确

socket=/var/lib/mysql/mysql.sock

您可以使用以下命令检查mysql是否正在运行:

mysqladmin -u root -p status

尝试将您的权限更改为 mysql 文件夹。如果你在本地工作,可以试试:

sudo chmod -R 777 /var/lib/mysql/

帮我解决了

【讨论】:

  • 它也适用于我,但是在我升级到最新版本之后出现这个问题,我可以知道为什么会这样吗?
  • sudo chmod -R 777 /var/lib/mysql/ 解决了我在启动 docker 容器 mysql 时遇到的问题
  • 你不应该让你的mysql数据目录世界可写! /var/lib/mysql 应该是 750 并将套接字文件移动到另一个目录(例如,在 /etc/my.cnf [mysqld] 和 [client] 部分中设置 socket=/tmp/mysql.sock)。或者至少将 /var/lib/mysql 设置为 755
【解决方案4】:

MySQL 服务器没有运行,或者这不是它的套接字文件的位置(检查 my.cnf)。

【讨论】:

  • 我遇到了上述问题,这就是问题所在。谢谢。
  • Homebrew 安装在哪里?
【解决方案5】:

mysql.sock 很可能在/var/lib/mysql/ 中不存在。

如果您在另一个位置找到相同的文件,则对其进行符号链接:

例如:我有它在/data/mysql_datadir/mysql.sock

切换用户到mysql并执行如下:

su mysql

ln -s /data/mysql_datadir/mysql.sock /var/lib/mysql/mysql.sock

这解决了我的问题

【讨论】:

  • 将 mysql.sock 重命名为其他名称,然后重新启动 mysqld(“服务 mysqld 重新启动”),然后将其他名称重命名为 mysql.sock 对我有用。这个答案略有不同,所以谢谢。
  • This 答案可能有助于定位mysql.sock 文件
  • 这些文字命令并没有解决我的具体用例的问题,但是使用符号链接到.sock 的概念确实做到了!
  • symlink 为我工作——我也有一个非标准目录路径中的 mysql 数据目录
【解决方案6】:

如果您使用的是最近的 RHEL,您可能需要启动 mariadb(一个开源 mysql 数据库)而不是 mysql 数据库:

yum remove mysql
yum -y install mariadb-server mariadb
service mariadb start

然后您应该能够以通常的方式访问 mysql:

mysql -u root -p

【讨论】:

  • 仅供参考,这也适用于 CentOS 8.1。安装mariadb-servermariadb后,别忘了运行mysql_secure_installation清理一些默认的不安全设置。
【解决方案7】:

只需编辑/etc/my.cnf 将以下行添加到my.cnf

[mysqld]

socket=/var/lib/mysql/mysql.sock 

[client]

socket=/var/lib/mysql/mysql.sock

重启mysql并再次连接

mysql -u 用户 -p 密码数据库 -h 主机;

【讨论】:

  • 唯一正确的答案。我想知道为什么它没有足够的赞成票。
  • 为我工作。非常感谢!
【解决方案8】:

在我的情况下,我已将套接字文件移动到 /etc/my.cnf 内的另一个位置 从/var/lib/mysql/mysql.sock/tmp/mysql.sock

即使重新启动 mysqld 服务后,我在尝试连接时仍然会看到错误消息。 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

问题在于客户端的配置方式。运行诊断实际上会显示正确的套接字路径。例如ps aux | grep mysqld

作品:

mysql -uroot -p -h127.0.0.1
mysql -uroot -p --socket=/tmp/mysql.sock

不工作:

mysql -uroot -p
mysql -uroot -p -hlocalhost

您可以修复此问题,方法是在 mysql 配置中的 [client] 部分下添加相同的 socket 行。

【讨论】:

    【解决方案9】:

    检查你的mysqld服务是否在运行,如果没有运行,启动服务。

    如果您的问题没有解决,请查找/etc/my.cnf 并进行如下修改,您会看到以socket 开头的行。在执行此更新之前备份该文件。

    socket=/var/lib/mysql/mysql.sock  
    

    改成

    socket=/opt/lampp/var/mysql/mysql.sock -u root
    

    【讨论】:

    • 嗨 Sekar,我输入了“find / -name my.cnf”,我得到了两个位置。 1)/opt/lampp/etc/my.cnf 2)/etc/mysql/my.cnf.那么,使用哪一个.. 我在这里问了问题.. stackoverflow.com/questions/32437796/…
    【解决方案10】:

    MariaDB 是一个社区开发的 MySQL 分支,已成为许多发行版中 MySQL 的默认实现。

    所以首先你应该开始,

    $ sudo systemctl start mariadb
    

    如果失败了,不如试试,

    $ sudo systemctl start mysqld
    

    然后启动mysql,

    $ mysql -u root -p
    

    从今天开始,在 Fedora 中这个包被命名为mariadb 在 Ubuntu 中,它被称为 mariadb-server

    因此,如果您的系统中尚未安装它,您可能需要安装它。

    【讨论】:

      【解决方案11】:

      确保/var 中有足够的空间。如果 Mysql 恶魔无法将附加信息写入驱动器,则 mysql 服务器将无法启动并导致错误Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

      考虑使用

      expire_logs_days = 10
      max_binlog_size = 100M
      

      这将帮助您降低磁盘使用率。

      【讨论】:

      • 谢谢,我在 oracle virtualbox 上运行 mysql,当我转储我的 bd 时,空间不足,无法启动 mysql 服务器,当我删除转储文件时,我能够重新启动mysql服务器。
      • 这为我解决了。对于生产环境,我将 innodb_buffer_pool_size 设置为非常高的值,这导致我的虚拟机上的 mysql 崩溃。
      • 我在使用 phabricator 时遇到了这个问题,解决方案是在 my.cnf 中更改 innodb_buffer_pool_size。将其设置为像innodb_buffer_pool_size = 50M 这样的小值是放弃这个假设的一个很好的测试;)
      • 那是个可怕的问题,除了磁盘空间外,检查了所有内容。从 /var 释放空间,它又回来了!
      【解决方案12】:

      请检查是否有另一个mysql服务正在运行。

      【讨论】:

        【解决方案13】:

        这对我有用:

        ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
        service mysqld restart
        

        【讨论】:

          【解决方案14】:

          确保您启动了服务器:

          mysql.server start
          

          然后连接root用户:

          mysql -uroot
          

          【讨论】:

            【解决方案15】:

            如果您的 mysql 之前正在工作并且突然停止,只需“重新启动”服务器即可。

            在我的 CentOS VPS 上遇到了这个问题。->

            不断得到

            Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)

            尝试了所有技术,最终重新启动服务器解决了问题 ->

            shutdown -r now

            希望这会有所帮助!!

            【讨论】:

              【解决方案16】:

              试试

              echo 0 > /selinux/enforce
              

              【讨论】:

              • 我的问题与 SELinux 有关,但这并没有解决。
              【解决方案17】:

              重现此错误的一种方法:如果您打算连接到外部服务器,但连接到不存在的本地服务器:

              eric@dev ~ $ mysql -u dev -p
              Enter password:
              ERROR 2002 (HY000): Can't connect to local MySQL server through 
              socket '/var/lib/mysql/mysql.sock' (2)
              eric@dev ~ $
              

              所以你必须像这样指定主机:

              eric@dev ~ $ mysql --host=yourdb.yourserver.com -u dev -p
              Enter password:
              Welcome to the MySQL monitor.  Commands end with ; or \g.
              Your MySQL connection id is 235
              Server version: 5.6.19 MySQL Community Server (GPL)
              
              Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
              
              mysql> show databases;
              +-------------------------+
              | Database                |
              +-------------------------+
              | information_schema      |
              | mysql                   |
              | performance_schema      |
              +-------------------------+
              3 rows in set (0.00 sec)
              
              mysql> exit
              Bye
              eric@dev ~ $
              

              【讨论】:

                【解决方案18】:

                如果您更改 /var/lib/mysql 中的文件 [例如复制或替换],则必须将文件所有者设置为 mysql,如果 mariadb.service 重启失败,这一点非常重要

                chown -R mysql:mysql /var/lib/mysql/*

                chmod -R 700 /var/lib/mysql/*

                【讨论】:

                  【解决方案19】:

                  首先输入“服务mysqld start”并登录

                  【讨论】:

                  • 你想说什么?请在此处提问之前阅读faq
                  • 这个问题三年前就成功回答了。这个确切的答案是在去年更完整地给出的。
                  【解决方案20】:

                  请确保您已经正确安装了MySQL服务器,我多次遇到这个错误,我认为从套接字调试很复杂,我的意思是重新安装它可能更容易。

                  如果你使用的是 CentOS 7,这里是正确的安装方法:

                  首先添加mysql社区源码
                  yum install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

                  那你就可以通过yum install mysql-community-server安装了

                  用 systemctl 启动它:systemctl start mysqld

                  【讨论】:

                    【解决方案21】:

                    我的问题是我成功安装了mysql,并且运行良好。

                    但是有一天,同样的错误发生了。

                    无法通过 socket '/var/lib/mysql/mysql.sock' 连接到本地 MySQL 服务器 (2)

                    并且不存在 mysql.sock 文件。

                    这个解决方案解决了我的问题,mysql 再次启动并运行:

                    以 root 身份登录:

                    sudo su -
                    

                    运行:

                    systemctl stop mysqld.service
                    systemctl start mysqld.service
                    systemctl enable mysqld.service
                    

                    以 root 身份测试:

                    mysql -u root -p
                    

                    mysql 现在应该已经启动并运行了。

                    我希望这也可以帮助其他人。

                    【讨论】:

                      【解决方案22】:

                      请注意,虽然 mysql 从 my.cnf 文件中读取套接字文件的位置信息,但 mysql_secure_installation 程序有时似乎无法正确执行。

                      因此,如果您像我一样在安装时随机播放,您可能会遇到这样的情况:您可以使用 mysql 连接到数据库就好了,但无法确保事情的安全(无论如何都不要使用该脚本)。

                      为了解决这个问题,sreddy 的建议效果很好:从脚本期望套接字的位置到它实际所在的位置建立一个软链接。示例:

                      ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
                      

                      (我使用 /tmp/ 作为套接字的默认位置)

                      【讨论】:

                        【解决方案23】:

                        以下更改对我有用

                        [mysqld] 中提到的任何套接字路径,在 my.cnf 中的 [client] 中相同,然后重新启动 mysql

                        [mysqld] socket=/var/lib/mysql/mysql.sock

                        [客户端] socket=/var/lib/mysql/mysql.sock

                        【讨论】:

                          【解决方案24】:

                          这可能是一个愚蠢的建议,但要 100% 确保您的数据库仍然托管在本地主机上。例如,如果网络管理员选择(或更改为)亚马逊数据库托管,您将需要该主机名!

                          【讨论】:

                          • 我正在使用托管服务提供商 1and1 并在 ssh-ing 到主机后收到此错误。修复只是提供主机名“mysql -u dbo70123521 -p --host db70313321.db.1and1.com db703133520”
                          【解决方案25】:

                          在我的情况下,我正在导入一个新数据库,之后我无法再次连接。最后我意识到这是一个空间问题。

                          所以你可以删除最后一个数据库并扩展你的硬盘驱动器或我所做的,恢复我的虚拟机的快照。

                          以防万一有人认为这很有用

                          【讨论】:

                            【解决方案26】:

                            当我用 yum 重新安装 mariadb 时,我遇到了这个问题,它将我的 /etc/my.cnf.d/client.cnf 重命名为 /etc/my.cnf.d/client.cnf.rpmsave 但保持 /etc/my.cnf 不变。

                            因为我已经在/etc/my.cnf 中配置了mysqld 的socket,在/etc/my.cnf.d/client.cnf 中配置了mysql 的socket 并带有自定义路径。

                            所以安装后mysql客户端找不到mysql的socket conf,所以尝试使用默认的socket路径连接msyqld,会出现这个问题。

                            以下是查找此问题的一些步骤。

                            1. 检查mysqld是否在ps -aef | grep mysqld下运行
                            $ps -aef | grep mysqld | grep -v grep
                            mysql    19946     1  0 09:54 ?        00:00:03 /usr/sbin/mysqld
                            
                            1. 如果mysqld正在运行,用netstat -ln | grep mysql显示它使用的套接字
                            $netstat -ln | grep mysql
                            unix  2      [ ACC ]     STREAM     LISTENING     560340807 /data/mysql/mysql.sock
                            
                            1. 检查套接字是否是mysql客户端试图连接。 如果没有,请编辑 /etc/my.conf.d/client.cnf 或 my.conf 以使套接字与 mysqld 中的套接字相同
                            [client]
                            socket=/data/mysql/mysql.sock
                            

                            你也可以编辑mysqld的socket,但是你需要重启或者重新加载mysqld。

                            【讨论】:

                              【解决方案27】:

                              遇到同样的问题——这就是我解决它的方法。

                              假设 mysqld 正在运行,那么问题可能只是 mysql 客户端不知道在哪里查找套接字文件。

                              解决此问题的最直接方法是将以下行添加到用户的配置文件 .my.cnf 文件(在 Linux 上,通常位于 /home/myusername 下):

                              socket=<path to the mysql socket file>
                              

                              如果那里没有 .my.cnf 文件,则创建一个包含以下内容的文件:

                              [mysql]
                              socket=<path to the mysql socket file>
                              

                              就我而言,由于我将 mysql 默认数据文件夹 (/var/lib/mysql) 移动到了不同的位置 (/data/mysql),因此我在 .my.cnf 中添加了以下内容:

                              [mysql]
                              socket=/data/mysql/mysql.sock
                              

                              希望这会有所帮助。

                              【讨论】:

                                【解决方案28】:

                                尝试在 SSH 客户端连接 mysql 时遇到此问题,发现在需要在套接字之间切换时将套接字路径添加到命令中很有帮助。

                                > mysql -u user -p --socket=/path/to/mysql5143.sock
                                

                                【讨论】:

                                  【解决方案29】:

                                  如果您的磁盘空间不足,这是一个问题。 解决方案是从 HDD 中释放一些空间。

                                  请阅读更多内容以获得解释:

                                  如果您在 LINUX 上运行 MySQL,请使用命令 disk free 检查硬盘的可用空间:

                                   df 
                                  

                                  如果你得到类似的东西:

                                  Filesystem           1K-blocks      Used Available Use% Mounted on
                                  /dev/sda2              5162828   4902260         0 100% /
                                  udev                    156676        84    156592   1% /dev
                                  /dev/sda3              3107124     70844   2878444   3% /home
                                  

                                  那么这就是问题所在,现在你有了解决方案!

                                  由于mysql.sock要创建在几乎总是在根文件夹下的mysql文件夹中,因为空间不足而无法实现。

                                  如果你定期在 mysql 目录下执行 ls 命令(在 openSUSE 11.1 中位于 /var/lib/mysql),你会得到类似的东西:

                                  hostname:/var/lib/mysql #
                                  .protected  IT     files        ibdata1             mysqld.log  systemtemp
                                  .tmp        NEWS   greekDB      mysql               mysqld.pid  test
                                  ARXEIO      TEMP1  ib_logfile0  mysql.sock          polis
                                  DATING      deisi  ib_logfile1  mysql_upgrade_info  restore
                                  

                                  mysql.sock 文件经常出现和消失(您必须尝试使用​​ ls 分配才能使用文件夹中的 mysql.sock 文件命中实例)。

                                  这是由于磁盘空间不足造成的。

                                  我希望我能帮助一些人!!!! 谢谢!

                                  【讨论】:

                                    【解决方案30】:

                                    我不得不从 my.cnf 禁用 explicit_defaults_for_timestamp

                                    【讨论】:

                                      猜你喜欢
                                      • 2018-10-09
                                      • 2016-05-23
                                      • 1970-01-01
                                      • 2012-10-14
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多