【ハマり解決】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について

 

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア
最新情報をチェックしよう!
>プログラミングスクール検索・比較表サイト

プログラミングスクール検索・比較表サイト

ワンクリック、さらに詳細に条件を指定してプログラミングスクールの検索ができます。さらに比較表により特徴を細かく比較できる!

CTR IMG