# MySQLに繋がりません! 満点 100 ## 問題文 先輩がMySQLサーバを立てて、新しく運用を開始したらしい。 そのサーバを利用するため、rootパスワードを教えて貰ったため、今までどおりのログインコマンドを試してみた。 `$ mysql -uroot -p -h 192.168.0.100` だが、なぜかログインエラーが出てしまい先輩のサーバにアクセスできない。先輩はサーバ上で正しく動いているらしいので、トラブルシューティングのためにそのサーバへのアクセス権限をもらった。 クライアントサーバから上記のコマンドを実行し、rootユーザがログインできるように変更を加え、下記の内容を報告してほしい。 ログインできるようになるためどのような作業を行ったのか なぜログインが行えなかったのか ### 問題サーバー #### クライアント IPアドレス: 192.168.0.101 ユーザー: admin パスワード: USerPw@19 #### サーバ IPアドレス: 192.168.0.100 ユーザー: admin パスワード: USerPw@19 DBユーザー: root DBパスワード: root ## やったこと @クライアント ``` $ mysql -uroot -p -h 192.168.0.100 Enter password: ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory ``` サーバー側に`/usr/lib/mysql/plugin/caching_sha2_password.so`が無いらしい? @サーバー ``` $ file /usr/lib/mysql/plugin/caching_sha2_password.so /usr/lib/mysql/plugin/caching_sha2_password.so: cannot open `/usr/lib/mysql/plugin/caching_sha2_password.so' (No such file or directory) $ ls /usr/lib/mysql/plugin/ adt_null.so connection_control.so mypluglib.so authentication_ldap_sasl_client.so ddl_rewriter.so mysql_clone.so auth_socket.so group_replication.so mysql_no_login.so component_audit_api_message_emit.so innodb_engine.so rewriter.so component_log_filter_dragnet.so keyring_file.so semisync_master.so component_log_sink_json.so keyring_udf.so semisync_slave.so component_log_sink_syseventlog.so libmemcached.so validate_password.so component_mysqlbackup.so libpluginmecab.so version_token.so component_validate_password.so locking_service.so $ ``` 無い https://www.s-style.co.jp/blog/2018/05/1807/ @サーバー ``` mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | caching_sha2_password | +-------------------------------+-----------------------+ 1 row in set (0.02 sec) mysql> SELECT host, user, plugin FROM mysql.user; +-----------+------------------+-----------------------+ | host | user | plugin | +-----------+------------------+-----------------------+ | % | root | caching_sha2_password | | localhost | mysql.infoschema | caching_sha2_password | | localhost | mysql.session | caching_sha2_password | | localhost | mysql.sys | caching_sha2_password | | localhost | root | caching_sha2_password | +-----------+------------------+-----------------------+ 5 rows in set (0.00 sec) ``` root二人いないか?←これは良くて、hostが違うのでOK @サーバー ``` $ mysql --version mysql Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL) ``` @クライアント ``` $ mysql --version mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper ``` バージョンの不一致。 解決 @サーバー ``` ALTER USER 'root'@"%" IDENTIFIED WITH mysql_native_password BY 'root'; ``` ## 回答 お疲れさまです。:thonk_spin.ex-large.rotate.parrot:の永田です。 問題「MySQLに繋がりません!」の回答をお送りいたします。 ### なぜログインが行えなかったのか サーバ側のMySQLのバージョンに対し、クライアント側のMySQLのバージョンが古い状態となっていました。 根拠 @サーバ ``` $ mysql --version mysql Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL) ``` @クライアント ``` $ mysql --version mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper ``` MySQL5.7ではmysql_native_passwordがデフォルトの認証プラグインでしたが、MySQL8.0ではcaching_sha2_passwordがデフォルトの認証プラグインです。 そのため、クライアントからの利用を想定したrootユーザーもcaching_sha2_passwordでユーザーが作られていました。 根拠 サーバ側からMySQLに入り設定を確認するコマンドを実行した結果以下の出力を得ました。 ``` mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | caching_sha2_password | +-------------------------------+-----------------------+ 1 row in set (0.02 sec) mysql> SELECT host, user, plugin FROM mysql.user; +-----------+------------------+-----------------------+ | host | user | plugin | +-----------+------------------+-----------------------+ | % | root | caching_sha2_password | | localhost | mysql.infoschema | caching_sha2_password | | localhost | mysql.session | caching_sha2_password | | localhost | mysql.sys | caching_sha2_password | | localhost | root | caching_sha2_password | +-----------+------------------+-----------------------+ 5 rows in set (0.00 sec) ``` ところがバージョン5.7のMySQLクライアントはcaching_sha2_passwordに対応していない為、クライアントから接続した際に接続エラーとなっていました。 一方サーバ側から接続した際は、バージョン8.0のMySQLクライアントが使用されるため、問題なく接続できていました。 ### ログインできるようになるためどのような作業を行ったのか 以下のコマンドを用いてクライアントからの利用を想定したrootユーザー(`'root'@"%"`)の認証プラグインをmysql_native_passwordに変更しました。 サーバ側からMySQLに入り以下のコマンドを実行しました。 ``` ALTER USER 'root'@"%" IDENTIFIED WITH mysql_native_password BY 'root'; ``` この変更により`'root'@"%"`の認証にmysql_native_passwordを用いるようになった為、クライアントからの接続が出来るようになりました。 デフォルトの認証プラグインは変更していない為、新しくユーザーを作成した際にも同様の操作を行ってください。 デフォルトの認証プラグインを変更する場合はmy.cnfを以下のように設定後にMySQLを再起動してください。 ``` [mysqld] default_authentication_plugin=mysql_native_password ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up