updated on 2019-04-20
MYSQL5.7まで有効なコマンドで、MySQL8では利用できません。
MacでMysqlを5.6から8.0にupgradeした後、LaravelからMysqlにアクセスできなくなった。
ちなみにupgradeのコマンドは、
$ brew upgrade mysql
$ mysql_upgrade -u root -p
修理手順1 MySQL8での、ユーザのパスワード変更
mysql > USE mysql;
mysql > ALTER USER 'root'@'localhost' identified BY 'your_now_password';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
// 一度終了
$ mysql.server stop
// セーフモードでの起動、
$ mysqld_safe --skip-grant-tables &
// パスワードなしでログインできる
$ mysql -u root
一度パスワードを空にします。
// root のパスワードを空にする
mysql > UPDATE mysql.user SET authentication_string=null WHERE User='root';
mysql > exit;
その後、MYSQLを再起動。空のパスワードでログインして、上記のALTERコマンドを実行します。
// MySQL再起動(非セーフモード)
$ mysql.server restart
// 空のパスワードでログイン
$ mysql -u root -p
// パスワード設定
mysql > USE mysql;
mysql > ALTER USER 'root'@'localhost' identified BY 'remake_password';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MySQLでは、パスワードの認証時に、実行される、「authentication plugin」という仕組みのがあります。
例えば上記のコマンドで設定したパスワードについて、下記のコマンドで、確認できます。
mysql> select User, Plugin from mysql.user where User = 'root';
+------+-----------------------+
| User | Plugin |
+------+-----------------------+
| root | caching_sha2_password |
+------+-----------------------+
Copy
下のコマンドで確かめられるように、MySQL8 からは、「caching_sha2_password」がデフォルトとなったようなのですが・・、
mysql > use mysql;
mysql > show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
Copy
mysqlを利用するクライアントソフトウェア(例えば、PhpMyAdminなど)では、この認証方法をサポートしていないため、エラーとなりログイン出来ないことがあるようです。
パスワードを下記のコマンドで設定すると、回避できます。
mysql> ALTER USER 'root'@'localhost' identified WITH mysql_native_password BY 'your_now_password';
Query OK, 0 rows affected (0.01 sec)
同様に「my.cnf」にも書き込んでおきます。これでデフォルトの認証プラグインを変更できましたので、これ以降の新規ユーザ作成時は、デフォルトで、mysql_native_password が使用されます。
修理手順2 my.cnfの設定を変更する
$ mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
左から順に存在するファイルを確認していく
$ ls -la /usr/local/etc/my.cnf
ls: /etc/my.cnf: No such file or directory
$ ls -la /usr/local/etc/my.cnf
ls: /etc/mysql/my.cnf: No such file or directory
$ ls -la /usr/local/etc/my.cnf
-rw-r--r--@ 1 nakajitatsuya admin 222 4 20 21:57 /usr/local/etc/my.cnf
/usr/local/etc/my.cnfが存在しているので、[mysqld]下に、
default_authentication_plugin = mysql_native_password
を加える
conf.d/my.conf
$ vi /usr/local/etc/my.cnf [mysqld] # 省略 default_authentication_plugin = mysql_native_password #<--追加
$ mysql.server restart
これで完了
はあ〜〜お疲れ様でした