MySQL - Authentication method 'caching_sha2_password' not supported by any of the available plugins.
이상하군요, MySQL 컨테이너를,
docker - MySQL 컨테이너 실행
; https://www.sysnet.pe.kr/2/0/12177
다시 latest로 실행시켰더니 그 이후부터 기존 응용 프로그램에서 다음과 같은 오류가 발생합니다.
// [닷넷의 경우]
MySQL: MySql.Data.MySqlClient.MySqlException (0x80004005): Authentication method 'caching_sha2_password' not supported by any of the available plugins.
at MySql.Data.MySqlClient.Authentication.AuthenticationPluginManager.GetPlugin(String method)
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.GetPlugin(String method, NativeDriver driver, Byte[] authData)
at MySql.Data.MySqlClient.NativeDriver.Authenticate(String authMethod, Boolean reset)
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at WebSiteTest.postgreSQLTest.MySqlTest()
at WebSiteTest.postgreSQLTest.Page_Load(Object sender, EventArgs e)
// [파이썬의 경우]
OperationalError at /testapp/mysqlclient_test
(2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory")
Request Method: GET
Request URL: http://127.0.0.1/testapp/mysqlclient_test
Django Version: 1.11.29
Exception Type: OperationalError
Exception Value:
(2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory")
Exception Location: /usr/local/lib/python2.7/site-packages/MySQLdb/connections.py in __init__, line 179
검색해 보니 다음의 글이 나오는군요,
Authentication method 'caching_sha2_password' not supported by any of the available plugins
; https://stackoverflow.com/questions/50088142/authentication-method-caching-sha2-password-not-supported-by-any-of-the-availa
대처 방법은 2가지입니다. MySQL 라이브러리를 사용하는 측의 응용 프로그램이 .NET Framework 4.5.2 이상의 플랫폼으로 빌드가 된다면 NuGet으로부터 새롭게 MySQL 패키지를 업데이트하면 됩니다.
반면 그 미만의 경우라면 MySQL 서버에서 인증 방식을 Legacy 모드로 바꿔야 합니다. 아래의 공식 문서를 보면,
6.4.1.2 Caching SHA-2 Pluggable Authentication
; https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html
기존의 방식은 "mysql_native_password"라고 하는군요. 바꿀 수 있는 방법은 위의 문서에서 여러 가지로 소개하고 있는데 그중에 새로운 user를 생성하는 방법으로 해결해 보겠습니다.
# /usr/bin/mysql -u root -p
mysql> create user 'nativeuser' identified with mysql_native_password by 'test_password';
// 만약 "ERROR 1410 (42000): You are not allowed to create a user with GRANT" 오류가 발생한다면, 생성한 사용자의 id와 grant 대상이 되는 id가 일치하는지 확인합니다.
// 계정 삭제: drop user nativeuser
물론 저렇게 바꿔주면 기존의 연결 문자열에 "User Id" 값도 변경해야 합니다.
<add key="MySqlConnection"
value="Data Source=192.168.100.50;Database=testdb;User Id=nativeuser;Password=test_password" />
그런데, 이렇게만 설정하고 테스트를 하면 권한 오류가 발생할 것입니다.
Authentication to host '192.168.0.8' for user 'nativeuser' using method 'mysql_native_password' failed with message: Access denied for user 'nativeuser'@'%' to database 'testdb'
적절한 권한도 줘야 합니다. ^^
mysql> grant all privileges on testdb.* to 'nativeuser';
Query OK, 0 rows affected (0.01 sec)
참고로, MySQL 측의 서버 옵션에 기본 인증 방식을 제공하는 것도 있습니다. docker container의 경우라면 해당 파일의 위치는 /etc/mysql/my.cnf에 있을 것이고,
#apt update
#apt install vim
# cat /etc/mysql/my.cnf
...[생략]...
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Custom config should go here
!includedir /etc/mysql/conf.d/
위의 mysqld 섹션에 다음의 값을 설정하면 될 듯한데요,
default_authentication_plugin=mysql_native_password
실제로 해보면, 오류는 여전히 발생했습니다. 딱히 해보진 않았지만, 아마도 기존 사용자들은 "caching_sha2_password"가 기본 인증으로 설정되었을 때 생성되었을 것이므로 그것의 영향을 받아 이미 인증 모드 설정이 caching_sha2_password로 되어 있기 때문일 것 같습니다. 구체적인 것은 테스트해야 알 수 있겠지만... 오늘은 일단 이 정도 선에서 마무리합니다. ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]