php artisan migrateが上手く行かない時の対処法/SQLSTATE[HY000] [1045]

LaravelのDB接続の際に出る「SQLSTATE[HY000] [1045]」エラーの対処法

こんにちは、フロントエンドエンジニアのてりーです。

普段はフロントエンド領域で開発をしています。
僕の詳しいプロフィールはこちら

結論から言うと、php artisan migrateでSQLSTATE[HY000] [1045]のエラーが出る場合はこれらが原因です!

  1. database.phpと.envに記載しているデータベース情報が正しくない
  2. データベースへのアクセス権限がない
  3. データベースサーバーが停止している

この記事では、詳しい解決方法を解説していきます!

では、いきましょう!

Laravelのおすすめ教材

関連記事

こんにちは、フロントエンドエンジニアのてりーです。 僕の詳しいプロフィールはこちら ・【未経験向け】独学で実務レベルまでLaravelをマスターするのにおすすめの教材 ・【ジュニアエンジニア向け】Laravelを極めるのにおすすめ[…]

    エラーコード:SQLSTATE[HY000] [1045]

      Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel_chat and table_name = migrations and table_type = 'BASE TABLE')
    
      at /Users/username/Desktop/laravel_chat/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
        660|         // If an exception occurs when attempting to run a query, we'll format the error
        661|         // message to include the bindings with SQL, which will make this exception a
        662|         // lot more helpful to the developer instead of just the database's errors.
        663|         catch (Exception $e) {
      > 664|             throw new QueryException(
        665|                 $query, $this->prepareBindings($bindings), $e
        666|             );
        667|         }
        668| 
    
      Exception trace:
    
      1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)")
          /Users/username/Desktop/laravel_chat/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
    
      2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel_chat", "root", "root", [])
          /Users/username/Desktop/laravel_chat/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
    
      Please use the argument -v to see more details.
    

    重要そうなのはここの部分ですね。

    SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' <br />(using password: YES) (SQL: select * from information_schema.tables <br />where table_schema = laravel_chat and table_name = migrations and table_type = 'BASE TABLE')

    原因:SQLSTATE[HY000] [1045]

    直接和訳すると 「root@localhostのアクセスが拒否された」的な感じ。

    Laravelでデータベースに接続できない時に出るエラーらしい。

    データベース接続をする為に以下の確認をすると良さそう。

    1. database.phpと.envでデータベース情報が正しいか確認する
    2. データベースへのアクセス権があるか確認する
    3. データベースサーバーがちゃんと動いているか確認する
    4. それでも解決しない場合は、Laravelログを見てより詳細なトレース情報から対策を練る

    上から試していきましょう!!

    SQLSTATE[HY000] [1045]対処法①:database.phpと.envでデータベース情報が正しいか確認する

    今回はmysqlを使っているので、mysqlのデータベースサーバーの情報と各ファイルの情報が一致しているか確認します!

    mysqlの接続情報を確認

    まず以下のコマンドでmysqlサーバーにログインします。

    mysql -u ユーザー名 -p;

    次に以下のクエリで接続情報を確認します。

    SHOW VARIABLES LIKE 'hostname'; SHOW VARIABLES LIKE 'port';

    接続情報、ユーザー名、パスワードが確認出来たら設定ファイルと合っているかを確認していきましょう!!

    database.phpを確認。

    'mysql' = [
                'driver' = 'mysql',
                'url' = env('DATABASE_URL'),
                'host' = env('DB_HOST', '127.0.0.1'),
                'port' = env('DB_PORT', '3306'),
                'database' = env('DB_DATABASE', 'XXX'),
                'username' = env('DB_USERNAME', 'XXX'),
                'password' = env('DB_PASSWORD', 'XXX'),

    次に.envファイルを確認

     DB_CONNECTION=mysql
     DB_HOST=127.0.0.1
     DB_PORT=3306
     DB_DATABASE=xxx
     DB_USERNAME=xxx
     DB_PASSWORD=xxx

    設定がうまくいけば、php artisan migrateが動くと思います!

    mysqlのユーザー名とパスワードを忘れた場合!

    もし、mysqlログインする際に

    mysql -u root(ユーザー名) -p;

    パスワードを求められたが、さっきのファイルに書いたパスワードだとエラーになる!!

    パスワードを忘れた!!!

    って人も案外いると思います!(僕も1回やりました…)

    その場合はパスワードリセットが必要になります。

    mysqlのパスワードリセットの方法

    1. mysqlを停止する

    MySQLを停止します。これにより、パスワードリセットのためのセキュリティ設定が無効化されます。

    sudo systemctl stop mysql

    2.  セキュリティ設定を無効化してMySQLを再起動する

    MySQLをセキュリティ設定を無効にした状態で再起動します

    sudo mysqld_safe --skip-grant-tables &

    3. 新しいパスワードを設定するために、mysqlのログインする

    mysql -u root

    4. パスワードを更新する

    以下のSQLクエリを使用して、新しいパスワードを設定します。

    USE mysql;
    UPDATE user SET password=PASSWORD("新しいパスワード") WHERE User='ユーザー名';
    FLUSH PRIVILEGES;

    5. mysqlを通モードで再起動する

    MySQLを通常のモードで再起動します。

    sudo systemctl restart mysql

    これで新規のパスワードが登録できたので、設定情報を確認できるはずです!

    SQLSTATE[HY000] [1045]対処法②:データベースアクセス権を確認する

    ①の対処法でも接続できなかった場合、mysqlのユーザーのアクセス権限がないことが考えられます。
    mysqlのログインしてアクセス権限を確認しましょう!
    管理者権限でmysqlのログイン
    mysql -u root -p

    次に確認したいユーザーの権限を以下のコマンドで見ます。

    SHOW GRANTS FOR 'ユーザー名'@'ホスト名';

    以下のようにSELECT、INSERT、UPDATEがあれば充分です!

    +-------------------------------------------------------------+
    | Grants for ユーザー名'@'ホスト名                                 |
    +-------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'ユーザー名'@'ホスト名'                  |
    | GRANT SELECT, INSERT, UPDATE ON `データベース名`.* TO ユーザー名'@'ホスト名' |
    +-------------------------------------------------------------+

    なかった場合は、以下のコマンドで権限を追加しましょう!

    GRANT SELECT, INSERT, UPDATE ON データベース名.* TO 'ユーザー名'@'ホスト名';

    これでアクセス権限が原因の場合は解消されます!
    php artisan migrateしてみて下さい!

    SQLSTATE[HY000] [1045]対処法③:データベースサーバーがちゃんと動いているか確認する

    コマンドラインからmysqlの可用性を確認していきます。

    以下のコマンドを実行して下さい。

    mysqladmin ping -h ホスト名 -u ユーザー名 -p

    「mysqld is alive」が出れば正常に動いています!
    エラーが出た場合はmysqlのシステムが停止している可能性あるので、再起動しましょう!

    sudo service mysql restart

    これによりmysqlが再起動されます!データベースサーバーが停止していることが原因の場合、これでphp artisan migrateが通るハズです!

    SQLSTATE[HY000] [1045]対処法④:それでも解決しない場合は、Laravelログを見る

    ①~③で一般的な解決策を紹介しましたが、それでも解決しない場合はログから詳細な状況を見る必要があります!

    以下のpathにlaravelのログが吐き出されているので確認しましょう。

    > storage/logs/laravel.log

    書いてあるログをベースに調査を進めてみて下さい。

    またlaravel.logの容量が増えてキレイにしたい場合は、以下の記事を参考にして下さい。

    関連記事

    こんにちは、フロントエンドエンジニアのてりーです。僕の詳しいプロフィールはこちら Laravel.logをclearする方法 Laravelのおすすめ教材 [sitecard subtitle=関連記事 url=https:/[…]

    結論

    php artisan migrateで上手く接続できない時は

    1. database.phpと.envに記載しているデータベース情報が正しくない
    2. データベースへのアクセス権ない
    3. データベースサーバーが停止している

      が原因である事がほとんどです!!

      この記事が皆さんの参考になれば幸いです!

      もしキャリアアップを考えているなら

      関連記事

      こんにちは、フロントエンドエンジニアのてりーです。 僕の詳しいプロフィールはこちら 今回は大学中退してニートだった自分が完全未経験からメガベンチャーに入社した方法について解説していきます。 ・完全未経験から将来的なメガベンチャー転[…]

      関連記事

      こんにちは、フロントエンドエンジニアのてりーです。 「転職ドラフトはハイスペックなエンジニア向けだけ?」と思っていませんか? 実は、技術力に自信がない、あるいは業界経験が浅いエンジニアこそ、転職ドラフトを使うべきなんです。 そ[…]