MySQLのコネクションエラーについて
MySQLに接続しようとすると、なぜか以下のようなエラーが出現しました。
Can't Connect to MySQL Server on 'localhost:3306'
ただMySQLをインストールしてから特に何もいじっていないのに、起動しようとしたらこのようなエラーが出ます。
また、mysqldやmysqldlogなどをファイルから起動してmysqlを開いたり、そのエラーのログを見ようとしてもなぜかすぐ落ちてしまいます。
こうした原因は何なのか、いろいろウェブサイトやAIに聞いて調べてみましたが、なかなか答えとなるようなものが出ませんでした。
結局何が問題なのか
このエラーが現れている原因は何個か考えられます。
それを見ていきましょう。
1. MYSQLサーバーが実行されていない
最もシンプルな理由で、MySQLサーバーが開いていないことが理由となります。
2. FireWallが邪魔をしている
もし、あなたのPCでFireWallが3306ポートへの接続をブロックするように設定されているのなら、あなたのその接続は失敗します。
3. 接続の設定が間違っている
ポート先、ホストネームやIPアドレスが接続設定として間違っているかもしれません。
4. ネットワークの問題
単純にネットワークが悪いのかもしれません。
解決した
ただ単にmysqlと打っても
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
こうしたエラーが出ていましたが、そうではなくて
mysql -u root -p
と入力することで、その後パスワードを求められ、そして正しいパスワードを無事入力することができ、MySQLサーバーと接続することができました。
更なる問題
このようにしてMySQLサーバーと接続することができましたが、node.jsでMySQLサーバーと接続しようとしても以下のようなエラーが出ます。
ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
調べてみると、これはNode.jsがMySQLサーバーが要求する認証プロトコルをサポートしていないそうです。
MySQL8.0.4以降のログイン認証方式はcaching_sha2_password
方式がデフォルトになっています。
しかし、nodeはそれをサポートしていないため、元のmysql_native_password
に戻す必要があります。
そのためには以下のコマンドをSQLコマンドラインで入力する必要があります。
alter user 'root'@'localhost' identified with mysql_native_password by '新パスワード';
これを実行して
Query OK, 0 rows affected (0.05 sec)
と帰ってくれば成功です。
その後に
select user, plugin from mysql.user;
を実行すると
user | plugin |
---|---|
mysql.infoschema | caching_sha2_password |
mysql.session | caching_sha2_password |
mysql.sys | caching_sha2_password |
root | mysql_native_password |
といったように、rootにmysql_native_passwordの認証方法が当たるようになったことが分かります。
これで無事にnodeからmysqlに接続することができます!
備忘録
ちなみにWindowsの人はMySQLでエラーが出た際に、my.iniファイルをいじる必要がでるかもしれませんが、my.iniファイルは初期ダウンロードの際にはProgramFileフォルダではなくて、ProgramDataフォルダの中に入っています。