【ハマり解決】python・dockerのmysql8に接続でcaching_sha2_passwordエラーが出た!

メイドさん

この記事では、pythonのライブラリmysql.connectorを使って、dockerのmysql8に接続しようとしたとき、caching_sha2_passwordエラーが出でて詰まった人に解決策を述べます!また、dockerを使っていなくてもcaching_sha2_passwordエラーの対処方法がわかると思います!

概要

pythonでmysql8にmysql.connectorライブラリーを使って接続しようとしたとき、

caching_sha2_passwordエラーが発生しました。

開発環境は以下の通り

macOS Catalina

mysql8(mysql公式のdocker image)

python 3.6

参考に現象が発生したときのコードは以下の通り。

import mysql.connector
 
#この部分でcaching_sha2_passwordエラーが発生した
db=mysql.connector.connect(host="localhost", port="3306",  user="root", password="mysql_pass")
 
cursor=db.cursor()
 
cursor.execute("USE test_work")
db.commit()
cursor.execute("""CREATE TABLE IF NOT EXISTS fruits_table(
                id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                fruits VARCHAR(32),
                value INT);""")
db.commit()

対処方法は2つ

対処方法は2つありますが、環境によっては、2つとも実施する必要があるようです。

私の環境は、2つの対処をしたら正しく動作するようになりました。

その1・ユーザの認証方式を変更する

解決策の1つ目は、ユーザーの承認方式をcaching_sha2_passwordからmysql_native_passwordに変更する方法です。

mysql8では、デフォルトの認証方式がcaching_sha2_passwordになっています。

しかし、mysql.connectorなど、ライブラリによっては、caching_sha2_passwordに対応していないケースもあります。その場合は、mysql5.7のデフォルトでもあるユーザの認証方式をmysql_native_passwordに変更します。

ユーザの認証方式は以下のようなコマンドで対応できます。

以下の例は、rootユーザの認証方式をmysql_native_password にする例です。

alter user 'root'@'localhost' identified WITH mysql_native_password by 'mysql_pass';
alter user 'root'@'%' identified WITH mysql_native_password by 'mysql_pass';

本当に変更されたかuserテーブルの情報を確認します。

スキーマーをmysqlに選択した上で、以下のSQLを実行します。

select user, host, plugin from user;

しかし、認証方式を変更しただけでは、caching_sha2_passwordエラーが解消しないケースもあります。

ポイント

ユーザーごとの認証方式をmysql_native_passwordにしただけではcaching_sha2_passwordエラーが解消しないことがある。

もしそのような場合は、次の項目も試してみます。

その2・my.cnfを修正してデフォルトプラグインの設定をmysql_native_passwordにする

  1. mysql8がインストールされているdockerにログインする。
  2. ファイル「/etc/mysql/my.cnf 」を開く
  3. ※「/etc/mysql/conf.d/」にも「my.cnf」が存在するが、mysqlの起動ができなくなるため変更しない。
  4. ファイルに「default_authentication_plugin= mysql_native_password」という行を追加
  5. コンテナを一旦stopし、再起動する(service mysql stopが何故か使えないため)

ファイルを変更したら、dockerのコンテナをstopしてからstart(再起動)します。

間違っても、コンテナを削除しないようにします。

これらの対処をしたら、「caching_sha2_passwordエラー」がでなくなり、mysql8に接続してデータを取得できるようになりました。

「caching_sha2_passwordエラー」の対処方法が知りたい人は、ここで終了です!

これ以降は、そもそも「caching_sha2_password」って何?について解説します。

知りたい人はどうぞという内容です。

ところでcaching_sha2_password認証って何?

メイドさん

caching_sha2_passwordからmysql_native_passwordに変更したら何かしらのデメリットがあるの?
そもそもcaching_sha2_password方式とは何?
解説します。

caching_sha2_password方式は、暗号方式SHA-2を使った認証方式で、サーバー側で、メモリ内に(認証関係のデータを)キャッシュにより、以前、接続したユーザーが再接続したときに、再認証を高速化できるものです。

同じユーザーが何度もmysqlに接続するようなケースでは、高速化されて有効な認証と言えます。

よって、mysql_native_passwordはcaching_sha2_passwordほど、高速な認証方式とは言えないが、デメリットはないと言えるでしょう。

caching_sha2_passwordについて

評判も見えるPGスクール検索・比較表

どのプログラミングスクールがいいんだろう?
そんな疑問をお持ちの方に、評判も見えるプログラミングスクール検索・一括比較サービスをリリースしました。

条件を指定することにより、気になるプログラミングスクールを一発で比較できます。
きっと、条件にあったスクールが見つかるかと思います!
詳細は、以下の画像をクリック!

プログラミングスクール検索・比較のペン太ブル
スポンサーリンク
PR




PR




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
PR