【laravel】MAMPの環境下でlaravelのmigrationをしようとしたらAccess deniedされた

# 背景
phpのフレームワークで人気があるlaravelを導入しようと思い、環境構築をしてMAMPを起動後Phpmyadminで作ったデータベースをmigrateしようとしたらエラーが出てしまいました。よく起こりがちなエラーですが、原因が分からないと苦戦するのでその内容について記事にまとめました。

# エラーの内容
composer、MAMP、そしてlaravelをインストールし、MAMPのPhpMyAdminでテーブルを作成。ユーザー登録まで完了。
![スクリーンショット 2021-04-07 16.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/0bd2ac32-b19e-1761-fea2-22a36ca9252b.png)
テーブル名はlaravel_taskでPrivileagesの「Add user account」からUser name、Host name、Passwordなどを入力。いざコマンドラインで「php artisan migrate」を入力したら、見事にエラー発生。

```ruby
/Applications/MAMP/htdocs/task_test
❯ php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'user_name'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel_task and table_name = migrations and table_type = 'BASE TABLE')

  at /Applications/MAMP/htdocs/task_test/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'redrabbit'@'localhost' (using password: YES)")
      /Applications/MAMP/htdocs/task_test/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel_task", "user_name", "password", [])
      /Applications/MAMP/htdocs/task_test/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 'user_name'@'localhost' (using password: YES)…」のようで、「Mysqlのアクセスが拒否された」という内容。

# 試したこと

アクセスができなかったのが原因だったので、Databaseのhost名、port番号、database名、username、passwordなどが「phpMyAdmin」の記載通りになっているのかを確認した。

>.envファイルの修正

```ruby
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_task
DB_USERNAME=user_name
DB_PASSWORD=password

```
DB_HOSTを「%」から「127.0.0.1」に、続いてDB_PORTを「3306」に…同じようにphpMyAdminに入力した通りにDB_DATABASE〜DB_PASSWORDを修正。

> database.phpの修正

```ruby
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'laravel_task'),
            'username' => env('DB_USERNAME', 'user_name'),
            'password' => env('DB_PASSWORD', 'password'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

```
'host'〜'password'までをphpMyAdminに記入したのと同じように修正。

> 再度migrationを実行する

```ruby
/Applications/MAMP/htdocs/task_test
❯ php artisan migrate
```

またして同じエラーが出る。原因が分からないまま、次の日の朝。MAMPは「Apache、MySQL、PHP」をパッケージ化したツールであることを思い出す。ひょっとしたら、MAMPってmigrateする際に専用のMysqlが動いているのでは？と思い、関連記事を探して読んでみる。
関連記事--> https://webkaru.net/mysql/mamp-command-line/
MAMPのコマンド群は「/Applications/MAMP/Library/bin/」にあるという内容を手掛かりに、フォルダーを移動し、Mysqlを起動させる

>MAMPのフォルダーでMysqlを起動

```ruby

❯ cd /Applications/MAMP/Library/bin/

/Applications/MAMP/Library/bin
❯ ./mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/Applications/MAMP/tmp/mysql/mysql.sock' (2)

```
またしてエラー発生。「ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/Applications/MAMP/tmp/mysql/mysql.sock' (2)」。つまりローカルでMySQLサーバーに接続できないということ。

>mysqlの実行ログを確認

```ruby
❯ ps ax | grep mysql
  453   ??  S      0:00.04 /bin/sh /usr/local/opt/mysql@5.6/bin/mysqld_safe --datadir=/usr/local/var/mysql
  585   ??  S      0:01.34 /usr/local/opt/mysql@5.6/bin/mysqld --basedir=/usr/local/opt/mysql@5.6 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.6/lib/plugin --log-error=Redrabbits-Air.err --pid-file=Redrabbits-Air.pid
 3575 s002  S+     0:00.01 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox mysql

```
>続いてmysqlが動いているかを確認

```ruby

❯ mysql.server status
 SUCCESS! MySQL running (585)
```
なんとmysqlが起動中…
rubyの環境構築する際にmysqlを自動起動させたことを思い出す。まさか！と思い関連記事を探す。
参考記事-->　https://qiita.com/s_tatsuki/items/52314f1eada0a4bab716

>brew services listで自動起動中のリストを確認する

```ruby

❯ brew services list
Name      Status  User      Plist
mysql@5.6 started username /Users/redrabbit/Library/LaunchAgents/homebrew.mxcl.mysql@5.6.plist
unbound   stopped
```
やはり「mysql@5.6 satrted username」となっている。これを一旦止める。

> brew services stop mysql@5.6と入力

```ruby
❯ brew services stop mysql@5.6
Stopping `mysql@5.6`... (might take a while)
==> Successfully stopped `mysql@5.6` (label: homebrew.mxcl.mysql@5.6)
```

再度migrationをしてみる

>php partisan migrateと入力

```ruby
/Applications/MAMP/htdocs/task_test
❯ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.18 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.16 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.11 seconds)
```
今度はうまくいったみたい😀
![スクリーンショット 2021-04-07 16.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/cf62a017-2554-8549-63e7-f3d4fa4a2a61.png)
テーブルがちゃんと生成されている。
#結論
　MAMPを利用したlaravelのmigrationにはmigrate実行時にMAMPのフォルダーの中にあるMySqlが実行される。よってlocalにインストールされている既存のMysqlが起動されている場合（自動起動）、「php artisan migrate」でmigrationしようとすると既にMysqlが実行されているため、エラーが出てしまう。これには注意が必要。