【Laravel】SQLSTATE[HY000] [2002] Connection refused が出た時のエラーの対処法

Laravelで開発中にエラーに遭遇したので備忘録で残しておきます。

SQLSTATE[HY000] [2002] Connection refused

マイグレーションによりスクリプトファイルを作成し、カラムを追加。

最後にartisanコマンド「php artisan migrate」により実行したところ以下のようなエラーに遭遇しました。

Illuminate\Database\QueryException

  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel_test and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712

    708▕         // If an exception occurs when attempting to run a query, we'll format the error

    709▕         // message to include the bindings with SQL, which will make this exception a

    710▕         // lot more helpful to the developer instead of just the database's errors.

    711▕         catch (Exception $e) {

  ➜ 712▕             throw new QueryException(

    713▕                 $query, $this->prepareBindings($bindings), $e

    714▕             );

    715▕         }

    716▕     }

      +36 vendor frames

  37  artisan:37

      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

エラーの内容

抜粋

SQLSTATE[HY000] [2002] Connection refused

調べてみるとこのようなエラーは

php artisan migrate

を実行したときに出てしまうエラーのようです。内容は

データベースとの接続が拒否されてしまったときに出るエラー

です。

原因を探る

このようなエラーになった時は大抵、.envファイルに問題があるようです。

.envファイルとはLaravelの動作環境や設定を変更できるファイルです。この.envファイルの場所は

プロジェクトディレクトリに置いてありますが、隠しファイルなので「shiftキー+commandキー+.キー」を同時に押すと表示されます。

.envファイルのデータベースが設定されている箇所を見てみます。

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

多くの場合はこの箇所に何らかの問題があるようです。

まずは書かれている内容がどういう意味なのかを確認します。

.envファイルの中身

DB_CONNECTION=データベースの種類
DB_HOST=127.0.0.1 or localhost
DB_PORT=3306 or 8889 (3306はMysql、8889はMAMP)
DB_DATABASE=接続したいデータベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード

ここではデータベースに接続するために必要な情報を環境変数(DB_HOSTなど)と呼ばれる変数に格納しています。この値を変更することで指定するデータベースに接続することができるようになります。

DB_CONNECTION=データベースの種類

こちらはデータベースの種類を指定します。

DB_HOST=127.0.0.1 or localhost

ホスト名(DB_HOST)はTCP接続を使う際はDB_HOSTを127.0.0.1unixソケットを使用して接続する際はDB_HOSTをlocalhostとします。

TCPとは通信プロトコルの一つであり安全重視で信頼性の高い通信を行うためのプロトコルです。

unixソケットは同じコンピューター上のサーバーに接続する場合にのみ使用できます。

DB_PORT=3306 or 8889 (3306はMysql、8889はMAMP(どちらでもOK))

ポート番号(DB_PORT)はMysqlを使用する場合は、3306でMAMPを使用する場合は8889を使用しますが、どちらを使用しても問題はないようです。

DB_DATABASE=接続したいデータベース名

データベース名(DB_DATABASE)は任意に設定したデータベース名を使用します。

DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード

ユーザー名(DB_USERNAME)、パスワード(DB_PASSWORD)はそれぞれ設定します。

MAMPで設定を見る

これらはMAMPのサーバーを起動した際に、以下のように一覧で見ることができます。

これを確認しながら、.envファイルと相違がないかを確認します。

原因 ⇨  不明でした

するとMAMPの画面にはソケットがありますが、.envファイルにはソケットがありませんのでこれが怪しいです。

以下のようにDB_SOCKETを追記しました。

DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

そして再度artisanコマンドを実行します。

php artisan migrate

すると成功しました。

ソケット(DB_SOCKET)とはMySQLとの通信(unixソケット)を処理してくれる機能のことです。ソケットのパスを記載することでunixソケットという接続方法が使用できるようになります。ここを設定しない場合はTCP接続になるようです。

 

しかし、今回はホスト名(DB_HOST)を「127.0.0.1」というIPアドレスを設定し、TCP接続にしているためunixソケットの処理は必要ないのでソケット(DB_SOCKET)の記述は必要ないのではと疑問に思ったため、再度、同じ条件でソケット(DB_SOCKET)を消してみて、php artisan migrateコマンドを実行したところ、成功してしまいました。おそらく色々いじくり回していた間に、直してしまったのでしょう。

なので、何が原因かは結局のところ、わかりませんでしたが.envファイルのことを詳しく調べることができたので良かったです。

まとめ

  1. .envファイルはLaravelの環境設定ができる隠しファイル
  2. .envファイルはデータベースとの接続が設定できる
  3. ホスト名(DB_HOST)はlocalhostかIPアドレスを指定でき、localhostはunixソケット、IPアドレスはTCPでの通信を指定できる
  4. unix通信を指定する場合はunixソケット(DB_SOCKET)のパスを指定しなければならない
  5. データベースとの接続設定はMAMPの設定を見れば良い

コメント