PDOException SQLSTATE [HY000] [2002]没有这样的文件或目录


319

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

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

在某个时候,迁移肯定已经成功了,因为我的表在那里-但这不能解释为什么它现在对我不起作用。



1
有时仅仅是因为您尚未安装mysql
Hassan Gilak '16

Answers:


142

错误消息表明尝试了通过套接字的MySQL连接(不支持)。

在Laravel(工匠)的背景下,您可能想要使用其他/正确的环境。例如:(php artisan migrate --env=production或任何环境)。看这里


1
这是解决我的问题的方法,我们公司的一名开发人员不使用Homestead,而是通过套接字连接到mysql。我在我的app / database.php文件中删除了套接字配置。问题已解决
borislemke '16

我只需要在php.ini中启用mysqli.so扩展名
Mehulkumar

4
我不得不添加“ 'unix_socket'=> '/Applications/MAMP/tmp/mysql/mysql.sock'”来的config / database.php中
安赫尔·卡洛斯·德尔波索Muela的

您好社会,我得到,即使我不使用laravel你可以看看这里的问题这个错误是stackoverflow.com/questions/60796332/...
基兰帕特尔

655

Laravel 4:app/config/database.php文件中的“主机” 从“本地主机”更改为“ 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(传输控制协议),这实际上意味着它通过计算机上的“本地Internet”运行,在这种情况下,它比UNIX套接字可靠得多。


3
奇怪的是,它也是我的解决方案,但是我能够从命令行使用mysql --host = localhost连接-可以,但是不能从PDO连接。
约翰

26
我很想知道为什么localhost不起作用并且127.0.0.1会起作用吗??
贾斯汀

6
这对我在命令行(终端)上运行php文件的MAMP系统上有效。它可以用作网页,但不能作为命令行文件,直到我将localhost更改为“ 127.0.0.1”
Samuel Fullman 2015年

1
@Justin我认为这是因为localhost尝试使用套接字,而127.0.0.1使用TCP。
pebbo

10
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
x-yuri

94

我遇到了同样的问题,并且我正在运行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',
        ),

现在,只需保存更改,然后重新加载页面,它就可以正常工作!


3
最“直接发行”的解决方案。谢谢,这使我无法使用MAMP pro运行Laravel
animaacija 2015年

谢谢你 这对我有用。使用OSX
10.10.5

这对于MAMP pro和OS X 10.11.x也同样有效。最终被:/Applications/MAMP/tmp/mysql/mysql.sock
车牌

1
+1。如Yamartino在他的回答中所说的那样,在配置中使用“ 127.0.0.1”代替“ localhost”可以很好地工作,但是使用套接字的速度更快,此答案解决了这个问题。尽管定义了unix_socket,但是mysql以这种特殊的方式对待“ localhost”真是太可惜了
Shautieh

@GregFerrell是的,但是很好...我希望它会有用
alexventuraio

51

我由于[PDOException] SQLSTATE[HY000] [2002] No such file or directory其他原因遇到了错误。我刚刚在Ubuntu 12.04上使用Apache 2.4.7,PHP v5.5.10和MySQL 5.6.16构建了一个全新的LAMP堆栈。我将网站移回并解雇了。但是,由于[PDOException]上述原因,我无法加载基于Laravel 4.2.x的网站。因此,我检查php -i | grep pdo并注意到以下这一行:

pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

但是,在我的/etc/my.cnf文件中,sock文件实际上位于/var/run/mysqld/mysqld.sock

因此,我打开了php.ini并设置了以下值pdo_mysql.default_socket

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

然后,我重新启动了apache并检查了php -i | grep pdo

pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

这为我解决了。


这是对我有用的修复程序,问题是我安装了两个版本的mysql,并删除了一个版本,127.0.0.1的更改不起作用或在配置中添加了袜子,谢谢!@dcarrith
路易斯,

2
这帮助我找到了问题-这是我使用的是OSX捆绑的php,而不是MAMP php二进制文件。因此,请确保您使用的是正确的php版本,该版本指向正确的php.ini等。时刻。
蜻蜓

43

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

简短答案:将/app/config/database.php文件中的“主机”从“本地主机”更改为“ 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'    => '',
    ),

4
就我而言,就是这样,'port' => '33060'但这个答案使我到了!
mopo922

25

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

homestead ssh

然后,简单地cd到正确的目录,然后在其中触发命令。


2
这行得通,我从我的计算机而不是ssh首先运行命令到VM并在那里运行命令。
cmac

我总是忘记这一步。嘿。1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant ssh就我而言
Marcos Curvello

22

就我而言,我一点问题都没有,只是忘了启动mysql服务...

sudo service mysqld start


18

在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'),

18

它的工作我的变化后,从DB_HOST=localhostDB_HOST=127.0.0.1在.ENV文件


2
这行得通,您是对的。您有任何想法解释为什么localhost不起作用吗?
Fusion

1
@Fusion如果您在容器内运行应用程序,它将理解为“ localhost”作为容器,127.0.0.1告诉它使用主机的数据库
deathemperor

我也遇到了这样的问题,无法清除缓存或无法运行工匠服务
Tom Mwenda

17

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

注意:仅限于Unix:当主机名设置为“ localhost”时,将通过域套接字建立与服务器的连接。如果针对libmysqlclient编译了PDO_MYSQL,则套接字文件的位置位于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上工作正常。


12

以@dcarrith的答案为基础...

我没有编辑配置文件,而是在PHP寻找的位置创建了一个别名,该别名连接到真实的mysql.sock。(来源

只需运行以下两个命令(无需重新启动):

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

11

步骤1

找到您的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' <-----
            ),
        ),

希望能帮助到你 !!


8

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

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

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

现在工作正常!


4

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


太好了,谢谢,我的端口是3306,但我的实际端口是8889
David

4

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

该解决方案的名称是在docker_compose.ymlDB_HOST上使用的MySQL服务容器的名称。就我而言,是db

DB_HOST=db

希望能帮助到你。


2

从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


2

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

以我为例,我从编辑的.ENV文件DB_HOST=localhostDB_HOST=192.168.10.10哪里192.168.10.10是我的流浪/宅基地主机的IP。


2

尝试连接到本地主机:

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

尝试连接到127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

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

[mysqld]
# skip-networking

当然,停止并启动MySQL Server。


2

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

service mysqld restart

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

service httpd restart

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


1

如果您使用的是Laravel Homestead,请在此处进行设置

(包括Vagrant-Virtual Machine)

.bash配置文件

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

1

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


这个问题没有一个正确的答案,因为可能会发生各种错误。这是其中之一,因为无法将.env文件复制到远程服务器。因此,值得在尝试运行查询的服务器上检查.env文件,以确保该文件既存在又包含建立连接所必需的信息。
petercoles '02

1

这发生在我身上,因为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,解决了该问题。


1

就我而言,当我需要ssh进入vagrant并从那里运行它时,我在我的mac终端上运行php artisan migration。希望可以帮助别人头疼。


1

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

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

DB_HOST=db

您还应该确保可以从php应用程序中找到主机。

这是因为PHP无法确定要使用哪个主机进行连接。


0

使用VirtualMachine时,请确保您SSH进入该计算机并导航至您的App文件夹,然后从那里调用php artisan migration命令。


0

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

vagrant up

代替

homestead up

为我使用宅基地的伪造幼体设置。我假设这意味着该站点已得到服务,但是从未启动过MySQL服务器。当我使用后一个命令启动我的无业游民的盒子时,错误消失了。


0

所有这些答案似乎繁重...

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

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

希望这可以帮助某人


0

对于试图在laravel上而不是在laravel上创建新的db连接的任何人,这里碰碰运气,寻求从终端运行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

} 

希望能帮助到你!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.