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

Viewed 665743

I believe that I've successfully deployed my (very basic) site to fortrabbit, but as soon as I connect to SSH to run some commands (such as php artisan migrate or php artisan db:seed) I get an error message:

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

At some point the migration must have worked, because my tables are there - but this doesn't explain why it isn't working for me now.

36 Answers

It worked after I change from DB_HOST=localhost to DB_HOST=127.0.0.1 at .env file

I had this problems when I was running my application using docker containers.

The solution was put the name of the MySQL service container I was using in docker_compose.yml on DB_HOST. In my case, it was db :

DB_HOST=db

Hope it helps.

I had the same problem using Docker and MySQL service name db in docker_compose.yml file:

I added the following in the .env file:

DB_HOST=db

you should also assure that your host is discoverable from the php app.

It was because PHP didn't figure out which host to use to connect.

Just i do one change in .env file

I have following line of code.

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

Change host name localhost to 127.0.0.1

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

That is work in my case because that can't find any hostname like localhost

And after changing hostname write following command

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

I got the same problem in ubuntu 18.04 with nginx. By following the below steps my issue has been fixd:

First open terminal and enter into mysql CLI. To check mysql socket location I write the following command.

mysql> show variables like '%sock%'

I got something like the below :

+-----------------------------------------+-----------------------------+
| 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)

In laravel project folder, look for the database.php file in the config folder. In the mysql section I modified unix_socket according to the above table.

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

Now just save changes, and reload the page and it worked.

In my case, I was running php artisan migrate on my mac terminal, when I needed to ssh into vagrant and run it from there. Hope that helps someone the headache.

In my case I had to remove the bootstrap/cache folder and try it again.

My cenario was after a server migration.

solved

in my case it was a logic issue in code, the connection values are in a if statement:

if($_SERVER['HTTP_HOST'] == "localhost")

so the solution was to add a pipe and add 127.0.0.1, that solved the problem for me

if($_SERVER['HTTP_HOST'] == "localhost" || $_SERVER['HTTP_HOST'] == "127.0.0.1")

For anyone trying to create a fresh db connection not on laravel but bumped here seeking for answers to run PDO from the Terminal. This would be of help to you. And you can refactor it to work best for you.

<?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

} 

hope it helps!

My answer is specific to Laravel.

I had this message after creating a new connection in the database.php configuration file to a local Docker MySQL service and setting it as the default connection. I forgot that I was setting a different connection by overwriting it in the Model:

class Model extends \Illuminate\Database\Eloquent\Model
{
    protected $connection;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->connection = 'some_other_connection';
    }
...

So even if my default connection in the database.php file was pointing to the right credentials, the model was still using the remote database connection configuration which I had removed from the local environment file.

To add to @alexventuraio's solution, if you are experiencing this issue on Laravel 5.8, you might want to replace the value of 'unix_socket' in your database config file as thus:

 'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        // 'unix_socket' =>'/var/run/mysqld/mysqld.sock',
        'unix_socket' => env('DB_SOCKET', ''), // replace with this line, so you can always add the mysqld.sock from the dotenv file
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => false,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],

All the existing answers are correct and might work for you. My case was a bit different. I encountered this error when I started a docker project locally using docker-compose up.

The problem for my specific case was that I ran the docker-compose up from a sub-folder instead of the root folder in which the docker-compose file lies.

Make sure you run docker-compose up from the folder where the docker-compose.yml is saved to!

Related