【问题标题】:PDOException SQLSTATE[HY000] [2002] No such file or directoryPDOException SQLSTATE[HY000] [2002] 没有这样的文件或目录
【发布时间】:2020-05-07 23:15:08
【问题描述】:

我相信我已经成功地将我的(非常基本的)站点部署到了 fortrabbit,但是一旦我连接到 SSH 以运行一些命令(例如 php artisan migratephp artisan db:seed),我就会收到一条错误消息:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

在某些时候迁移一定是成功的,因为我的表在那里 - 但这并不能解释为什么它现在不适合我。

【问题讨论】:

标签: php mysql laravel database pdo


【解决方案1】:

我只需对 .env 文件进行一次更改

我有以下代码行。

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=

将主机名 localhost 更改为 127.0.0.1

DB_CONNECTION=mysql
DB_HOST=127.0.01
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=

这对我来说是有效的 因为找不到像 localhost 这样的主机名

更改主机名后写入以下命令

php artisan config:clear
php artisan migrate:install
php artisan migrate

【讨论】:

    【解决方案2】:

    我在使用 nginx 的 ubuntu 18.04 中遇到了同样的问题。按照以下步骤,我的问题已得到解决:

    首先打开终端并进入mysql CLI。要检查 mysql 套接字位置,我编写了以下命令。

    mysql> show variables like '%sock%'
    

    我得到了类似下面的东西:

    +-----------------------------------------+-----------------------------+
    | Variable_name                           | Value                       |
    +-----------------------------------------+-----------------------------+
    | mysqlx_socket                           | /var/run/mysqld/mysqlx.sock |
    | performance_schema_max_socket_classes   | 10                          |
    | performance_schema_max_socket_instances | -1                          |
    | socket                                  | /var/run/mysqld/mysqld.sock |
    +-----------------------------------------+-----------------------------+
    4 rows in set (0.00 sec)
    

    在 laravel 项目文件夹中,在 config 文件夹中查找 database.php 文件。在mysql部分我根据上表修改了unix_socket。

    'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database_name',
            'username'  => 'username',
            'password'  => 'password',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/var/run/mysqld/mysqld.sock',
        ),
    

    现在只需保存更改,然后重新加载页面即可。

    【讨论】:

      【解决方案3】:

      Laravel 4:app/config/database.php文件中的“host”从“localhost”改为“127.0.0.1”

      Laravel 5+:.env文件中的“DB_HOST”从“localhost”改为“127.0.0.1”

      我遇到了完全相同的问题。以上解决方案都不适合我。我通过将 /app/config/database.php 文件中的“主机”从“localhost”更改为“127.0.0.1”解决了这个问题。

      不确定为什么默认情况下“localhost”不起作用,但我在 symfony2 帖子中解决的类似问题中找到了这个答案。 https://stackoverflow.com/a/9251924/1231563

      更新: 有人问为什么这个修复有效,所以我对这个话题做了一些研究。似乎他们使用了不同的连接类型,正如这篇文章 https://stackoverflow.com/a/9715164/1231563

      中所解释的那样

      这里出现的问题是“localhost”使用 UNIX 套接字,无法在标准目录中找到数据库。然而,“127.0.0.1”使用 TCP(传输控制协议),这实际上意味着它通过您计算机上的“本地互联网”运行,在这种情况下比 UNIX 套接字更可靠。

      【讨论】:

      • 奇怪,这也是我的解决方案,但我可以从命令行连接 mysql --host=localhost - 可以,但不能从 PDO。
      • 我很想知道为什么localhost 不起作用而127.0.0.1 起作用??
      • 这适用于我在命令行(终端)上运行 php 文件的 MAMP 系统。它可以作为网页使用,但在我将 localhost 更改为“127.0.0.1”之前不能作为命令行文件
      • @Justin 我认为这是因为 localhost 尝试使用套接字,而 127.0.0.1 使用 TCP。
      • A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
      【解决方案4】:

      我在 docker_compose.yml 文件中使用 Docker 和 MySQL 服务名称 db 时遇到了同样的问题:

      我在.env 文件中添加了以下内容:

      DB_HOST=db
      

      您还应该确保您的主机可以从 php 应用程序中发现。

      这是因为 PHP 没有弄清楚使用哪个主机来连接。

      【讨论】:

      • 同样的问题,仍然使用DB_HOST=localhost并在将其更改为DB_HOST=127.0.0.1时得到SQLSTATE[HY000] [2002] No such file or directory,错误更改为SQLSTATE[HY000] [2002] Connection refused。只有当我将其更改为 MySQL docker 容器的名称时,它才开始工作,即:在我的情况下为 DB_HOST=mysql。不知道为什么会这样,当其他答案声称它与套接字有关时,我的猜测是某种回退机制,不正确的检查会引发误导性错误。
      【解决方案5】:

      我的回答是针对 Laravel 的。

      database.php 配置文件中创建与本地 Docker MySQL 服务的新连接并将其设置为默认连接后,我收到了此消息。我忘记了我通过在模型中覆盖它来设置不同的连接:

      class Model extends \Illuminate\Database\Eloquent\Model
      {
          protected $connection;
      
          public function __construct(array $attributes = [])
          {
              parent::__construct($attributes);
              $this->connection = 'some_other_connection';
          }
      ...
      

      因此,即使我在 database.php 文件中的默认连接指向正确的凭据,该模型仍在使用我从本地环境文件中删除的远程数据库连接配置。

      【讨论】:

        【解决方案6】:

        就我而言,我不得不删除 bootstrap/cache 文件夹并重试。

        我的场景是在服务器迁移之后。

        【讨论】:

        • 解决了我的问题。我试图使用 php artisan db:create 创建数据库。虽然在这个命令之前我有一个数据库,但我需要新的数据库。 ,但我面对。没有任何更改会影响 mysql 连接
        【解决方案7】:

        我在访问我的 Drupal 网站时遇到了类似的问题。我通过打开命令行并重新启动我的 MySQL 服务器或服务来修复它:

        service mysqld restart
        

        这应该可行。如果没有,请重新启动本地网络服务器:

        service httpd restart
        

        应该够了。希望它也适用于其他环境。请注意,这些命令通常需要超级用户权限。

        【讨论】:

          【解决方案8】:

          在我的情况下,我完全没有问题,只是忘记启动 mysql 服务......

          sudo service mysqld start
          

          【讨论】:

            【解决方案9】:

            对于那些试图在 laravel 上创建新的数据库连接但在这里寻找从终端运行 PDO 的答案的人。这对你会有帮助。您可以对其进行重构以使其最适合您。

            <?php
            
            class db
            {
               private $DBHOST = 'localhost'; // you don't need 127.0.0.1
               private $DRIVER = 'mysql';
               private $PORT   = '8888'; // database port. 8888 is mine
               private $DB     = 'example-db';
               private $PASS   = 'example-pass';
               private $USER   = 'root';
               private $SOCKS  = ''; // can fill this or leave blank.
            
            
               // - connect (dummy connection)
               private function con()
               {
                   if ($this->SOCKS == '')
                   {
                       // run shell command to get 
                       $socks = shell_exec('netstat -ln | grep mysql');
                       $socks = trim(substr($socks, strpos($socks, '/')));
            
                       $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
                   }
                   else
                   {
                      $this->SOCKS = ';unix_socket='.$this->SOCKS;
                   }
            
                   $dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;
            
                   // add socks
                   $dsn .= $this->SOCKS;
            
                   // add port
                   $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';
            
                   // extablish connection
                   $con = new PDO($dsn, $user, $pass);
            
                   // return PDO instance.
                   return $con;
               }
               // - ends here
            
               // now you can call $this->con() within class to use connection 
               // would run fine on any terminal
            
            } 
            

            希望对你有帮助!

            【讨论】:

              【解决方案10】:

              我遇到了同样的问题,我正在运行 Mac OS X 10.10 Yosemite。我已经启用了操作系统自带的 Apache 服务器和 PHP。然后我刚刚配置了 mCrypt 库就可以开始了。之后,当我使用模型和数据库时,我得到了错误:

              [PDOException]
              SQLSTATE[HY000] [2002] No such file or directory
              

              我找到的原因只是因为 PHP 和 MySQL 本身无法连接。 为了解决这个问题,我按照以下步骤操作:

              1. 打开一个终端并连接到mysql:

                mysql -u root -p
                
              2. 它会询问您相关的密码。然后一旦你得到 mysql promt 输入下一个命令:

                mysql> show variables like '%sock%'
                
              3. 你会得到这样的东西:

                +-----------------------------------------+-----------------+
                | Variable_name                           | Value           |
                +-----------------------------------------+-----------------+
                | performance_schema_max_socket_classes   | 10              |
                | performance_schema_max_socket_instances | 322             |
                | socket                                  | /tmp/mysql.sock |
                +-----------------------------------------+-----------------+
                
              4. 保留最后一行的值:

                /tmp/mysql.sock
                
              5. 在您的laravel 项目文件夹中,查找您配置数据库连接参数的database.php 文件。在 mysql 部分的末尾添加下一行:

                'unix_socket' => '/tmp/mysql.sock'
                
              6. 你必须有这样的东西:

                'mysql' => array(
                        'driver'    => 'mysql',
                        'host'      => 'localhost',
                        'database'  => 'SchoolBoard',
                        'username'  => 'root',
                        'password'  => 'venturaa',
                        'charset'   => 'utf8',
                        'collation' => 'utf8_unicode_ci',
                        'prefix'    => '',
                        'unix_socket' => '/tmp/mysql.sock',
                    ),
                

              现在只需保存更改,然后重新加载页面,它必须工作!

              【讨论】:

              • 最“直接发布”的解决方案。谢谢,这让我无法使用 MAMP pro 运行 Laravel
              • 谢谢。这对我有用。使用 OSX 10.10.5 MAMP Pro
              • 这对我也适用于 MAMP pro 和 OS X 10.11.x。最终成为:/Applications/MAMP/tmp/mysql/mysql.sock
              • +1。正如Yamartino在他的回答中所说,在配置中使用“127.0.0.1”而不是“localhost”效果很好,但使用套接字更快,这个答案解决了问题。遗憾的是,当定义 unix_socket 时,mysql 以这种特殊的方式对待“localhost”......
              • @GregFerrell 是的,没错,但很好......我希望它有用
              【解决方案11】:

              我在使用 docker 容器运行我的应用程序时遇到了这个问题。

              解决方案是将我使用的 MySQL 服务容器的名称放在 DB_HOST 上的docker_compose.yml 中。就我而言,它是db

              DB_HOST=db
              

              希望对你有帮助。

              【讨论】:

              • 不错!你拯救了我的夜晚 kek :)
              • 如果你在容器中运行 Laravel 应用程序,你需要使用容器凭证。例如。 mysql 公开端口 33333:3306 以供 DB_PORT 使用 3306。
              【解决方案12】:

              我在 .env 文件中从 DB_HOST=localhost 更改为 DB_HOST=127.0.0.1 后它工作了

              【讨论】:

              • 这行得通,你是对的。你有什么想法可以解释为什么localhost 不起作用?
              • @Fusion 如果你在容器中运行你的应用程序,它会将'localhost'理解为容器,127.0.0.1 告诉它使用主机的数据库
              • 我也遇到过这样的问题,无法清除缓存或运行 artisan serve
              【解决方案13】:

              在我的情况下,我在我的 mac 终端上运行 php artisan migrate,当我需要 ssh 到 vagrant 并从那里运行它时。希望对头痛的人有所帮助。

              【讨论】:

                【解决方案14】:

                这是因为 PDO 特别对待“localhost”主机:

                注意:仅限 Unix:当主机名设置为“localhost”时, 通过域套接字建立与服务器的连接。如果 PDO_MYSQL 是 针对 libmysqlclient 编译,然后是套接字文件的位置 在 libmysqlclient 的编译位置。如果编译 PDO_MYSQL 针对 mysqlnd 可以通过以下方式设置默认套接字 pdo_mysql.default_socket 设置。

                (来自http://php.net/manual/en/ref.pdo-mysql.connection.php

                将 localhost 更改为 127.0.0.1 将“强制”使用 TCP。

                注意:mysqli_connect 在 localhost 上运行良好。

                【讨论】:

                  【解决方案15】:

                  仔细检查您的端口。就我而言,它是 8889,我正在使用 8888。 将“DB_HOST”从“localhost”更改为“127.0.0.1”,反之亦然

                  【讨论】:

                  • 太好了,谢谢,我的端口是 3306,但我的真实端口是 8889
                  【解决方案16】:

                  第一步

                  找到你的 unix_socket 的路径,只需运行netstat -ln | grep mysql

                  你应该得到这样的东西

                  unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock
                  

                  第 2 步

                  把它添加到你的 unix_socket 参数中

                  'mysql' => array(
                              'driver'    => 'mysql',
                              'host'      => '67.25.71.187',
                              'database'  => 'dbname',
                              'username'  => 'username',
                              'password'  => '***',
                              'charset'   => 'utf8',
                              'collation' => 'utf8_unicode_ci',
                              'prefix'    => '',
                              'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
                              ),
                          ),
                  

                  希望对你有帮助!!

                  【讨论】:

                    【解决方案17】:

                    这发生在我身上是因为 MySQL 没有运行。 MySQL 无法启动,因为我缺少 /usr/local/etc/my.cnf.d/ 目录。

                    这是我的/usr/local/etc/my.cnf 配置文件作为全局包含 (include /usr/local/etc/my.cnf.d/*.cnf) 所要求的。

                    运行mkdir /usr/local/etc/my.cnf.d,然后启动 MySQL,解决了这个问题。

                    【讨论】:

                      【解决方案18】:

                      @stuyam 的回答为我解决了“没有这样的文件或目录”的问题

                      简答:将 /app/config/database.php 文件中的“host”从“localhost”更改为“127.0.0.1”

                      但后来出现“连接被拒绝”错误。如果有人遇到同样的问题,我的解决方案是更新 app/config/local/database.php 文件,使端口为 8889:

                      'mysql' => array(
                              'driver'    => 'mysql',
                              'host'      => '127.0.0.1',
                              'port'      => '8889',
                              'database'  => 'databaseName',
                              'username'  => 'root',
                              'password'  => 'root',
                              'charset'   => 'utf8',
                              'collation' => 'utf8_unicode_ci',
                              'prefix'    => '',
                          ),
                      

                      【讨论】:

                      • 就我而言,它是'port' =&gt; '33060' 但这个答案让我到了那里!
                      【解决方案19】:

                      在 database.php 文件中添加 mysql.sock 路径,如下例所示

                      'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
                      

                      示例

                      'mysql' => [
                              'driver' => 'mysql',
                              'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
                              'host' => env('DB_HOST', 'localhost'),
                              'port' => env('DB_PORT', '8889'),
                      

                      【讨论】:

                        【解决方案20】:

                        所有这些答案似乎都是繁重的......

                        我刚刚创建了一个.env 文件;编辑了我的bootstrap/app.php 文件,并取消注释以下行...

                        Dotenv::load(__DIR__.'/../');

                        希望这对某人有所帮助

                        【讨论】:

                          【解决方案21】:

                          Mamp 用户启用选项允许网络访问 MYSQL

                          【讨论】:

                            【解决方案22】:

                            如果有人仍在寻找答案,请检查您的 .env 文件。出于某种原因,laravel 创建了一个 .env.example 文件,所以所有这些答案都对我不起作用。我修复了将 .env.example 重命名为 .env 的问题

                            【讨论】:

                            • 这个问题没有唯一的正确答案,因为可能会犯各种错误。这是其中之一,因为无法将 .env 文件复制到远程服务器。因此,值得检查您尝试运行查询的服务器上的 .env 文件,以确保它既存在又包含建立连接所需的信息。
                            【解决方案23】:

                            尝试连接本地主机:

                            SQLSTATE[HY000] [2002] No such file or directory
                            

                            尝试连接到 127.0.0.1:

                            SQLSTATE[HY000] [2002] Connection refused
                            

                            好的,只需从 my.cnf 中注释/删除以下设置(在 OS X 10.5 上:/opt/local/etc/mysqlxx/my.cnf)即可获得:

                            [mysqld]
                            # skip-networking
                            

                            当然,停止并启动 MySQL Server。

                            【讨论】:

                              【解决方案24】:

                              我在 Elixir/Gulp 和 Homestead 作为我的 Vagrant 环境中运行 PHPUnit 时遇到了这个问题。

                              在我的例子中,我将 .env 文件从 DB_HOST=localhost 编辑为 DB_HOST=192.168.10.10,其中 192.168.10.10 是我的 Vagrant/Homestead 主机的 IP。

                              【讨论】:

                                【解决方案25】:

                                在可能的情况下,我只是使用了

                                vagrant up
                                

                                而不是

                                homestead up
                                

                                对于我使用宅基地的伪造幼虫设置。我假设这意味着该站点正在获得服务,但 MySQL 服务器从未启动过。当我使用后一个命令启动我的 vagrant box 时,错误消失了。

                                【讨论】:

                                  【解决方案26】:

                                  我在 MAMP Pro 上运行,并且在尝试迁移(创建数据库表)时遇到了类似的问题。也尝试了其中一些提到的建议,但没有为我做。

                                  所以,简单地说(经过一个小时的谷歌搜索),我在 /config/database.php 中添加了两件事。

                                  'port' => '1234',
                                  'unix_socket' => '/path/to/my/socket/mysqld.sock'
                                  

                                  现在工作正常!

                                  【讨论】:

                                    【解决方案27】:

                                    如果你使用 Laravel Homestead, 这是设置

                                    (包括 Vagrant-Virtual Machine)

                                    .bash-profile

                                    alias vm="ssh vagrant@127.0.0.1 -p 2222"
                                    

                                    database.php

                                        'mysql' => [
                                            'driver'    => 'mysql',
                                            'host'      => env('DB_HOST', '127.0.0.1'),
                                            'database'  => env('DB_DATABASE', 'homestead'),
                                            'username'  => env('DB_USERNAME', 'homestead'),
                                            'password'  => env('DB_PASSWORD', 'secret'),
                                            'charset'   => 'utf8',
                                            'collation' => 'utf8_unicode_ci',
                                            'prefix'    => '',
                                            'strict'    => false,
                                        ],
                                    

                                    终端

                                    vm
                                    
                                    vagrant@homestead:~/Code/projectFolder  php artisan migrate:install
                                    

                                    【讨论】:

                                      【解决方案28】:

                                      使用 VirtualMachine 时,请确保您 ssh 进入该机器并导航到您的 App 文件夹并从那里调用 php artisan migrate 命令。

                                      【讨论】:

                                        【解决方案29】:

                                        从 Laravel 5 开始,数据库用户名和密码位于项目目录中的 .env 文件中,例如

                                        DB_HOST=127.0.0.1
                                        DB_DATABASE=db1
                                        DB_USERNAME=user1
                                        DB_PASSWORD=pass1
                                        

                                        如您所见,这些环境变量在这里覆盖了“forge”字符串,因此更改它们没有任何效果:

                                            'mysql' => [
                                                'driver'    => 'mysql',
                                                'host'      => env('DB_HOST', 'localhost'),
                                                'database'  => env('DB_DATABASE', 'forge'),
                                                'username'  => env('DB_USERNAME', 'forge'),
                                                'password'  => env('DB_PASSWORD', ''),
                                                'charset'   => 'utf8',
                                                'collation' => 'utf8_unicode_ci',
                                                'prefix'    => '',
                                                'strict'    => false,
                                            ],
                                        

                                        更多信息在这里https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables

                                        【讨论】:

                                          【解决方案30】:

                                          如果您使用的是 Laravel Homestead,请确保您正在调用服务器上的命令。

                                          homestead ssh
                                          

                                          然后简单地 cd 到正确的目录并在那里触发你的命令。

                                          【讨论】:

                                          • 这行得通,我是从我的计算机运行命令而不是先通过 ssh 进入 VM 并在那里运行命令。
                                          • 我总是忘记这一步。呵呵。 1.source ~/.zshrc 2.homestead up --provision 3.homestead ssh
                                          • vagrant ssh 在我的情况下
                                          猜你喜欢
                                          • 2015-06-24
                                          相关资源
                                          最近更新 更多