[TROUBLE_SHOOTING]Ubuntu - Docker에서 MySQL 사용시 Access denied for user 'root@'@'localhost'

hanana·2024년 5월 24일

요약
1. MySql 8.3버전 이하라면 1번 항목. 패스워드 타입을 mysql_native_password로 변경한다.
2. MySql 8.4버전 이상이라면 4번 항목. mysql-native-password=ON 속성을 추가해준다.


로컬환경에서 docker를 이용할 땐 잘 올라왔지만

서버에서 .jar파일을 실행할 때 제목과 같은 에러가 발생했습니다.

시도해본 절차는 다음과 같습니다.


1. 계정의 패스워드 타입 변경

참고
https://oziguyo.tistory.com/36
https://stackoverflow.com/questions/28068155/access-denied-for-user-rootlocalhost-using-password-yes-after-new-instal

페스워드를 기존 caching_sha2_password 타입에서 mysql_native_password 타입으로 변경해주는 방법입니다.

기존

mysql>  SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.17 sec)

쿼리수행

mysql> update user set plugin='mysql_native_password' where user='root';
Query OK, 2 rows affected (0.04 sec)
Rows matched: 2  Changed: 2  Warnings: 0

이후

mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

1- 결과

Plugin 'mysql-native-password' is not loaded와 같은 에러가 발생했습니다.
설치된 mysql의 설정정보를 변경해야 할 것 같은데
가상환경에서 실행하다보니 직접 설정을 건드리기에는 조금 부담스러웠고,
native-password를 쓰지말라고 기본값으로 설정해놨는데, 이걸 우회하는 방법이 그다지 마음에 들지 않았습니다. (root 계정을 쓰며...)
다른방법은 없을지 고민해보았습니다.


2. 계정 새로 생성하기

참고
https://happymemoryies.tistory.com/69
https://csksoft.tistory.com/69

사실 제목에는 ...'root@'@'localhost'이라고 적었지만
콘솔창에서의 정확한 오류는 'root@'@'127.17.0.1'출력됐었습니다.
오류를 서칭하는 중
docker에서는 도메인을 localhost가 아니라 Docker의 가상 IP로 지정해주어야 한다는 글을 발견했습니다.

mysql> CREATE USER 'root'@'172.17.0.1' IDENTIFIED BY 'sample_password';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.1' WITH GRANT OPTION;
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit;
Bye

2- 결과

... 여전히 Access denied for user 'root@'@'localhost' 라는 에러가 해결되지 않았습니다.

참고글에서는 docker shell에 vim을 설치해서 설정파일을 바꾸셨는데
docker shell에 sudo 권한 줘야하고...
계정생성도 root@localhost가 아닌, root로 생성하였기 때문에, 해당 설정을 통해서 과연 문제를 해결할 수 있을까? 에 대한 의문이 들어서
이쯤해보고 다른 방법을 찾아보기로 하였습니다.


3. 금단의 비기.... 버전내리기... 8.4 > 8.3

이 방법을 채택하고 싶진 않았지만.....
판단의 근거는 아래와 같습니다.

  1. 실제로 운영할 서버가 아니다.
    맨날 localhost에서만 개발을 하다보니까 반쪽자리 개발을 하는기분이 들어서
    한번 서버에 띄워보는것이 목적이었습니다.
  2. 프리티어에 OnPremiss 환경으로 구축하여 RDS를 따로 사용하지 않았다.
    심지어 mysql을 설치하지도 않고, docker를 통해서 컨테이너를 생성하고,
    mysql을 띄우기만 했으므로, 제대로 DB환경을 구축하지 않은 채
    버전만 내리면 해결될 것 같은 문제를 몇일동안 붙잡고 있는것은 비효율적이라고 생각했습니다.
  3. docker의 이미지만 바꾸면 되므로 버전을 변경하는데 부담이 없었다.
  4. 원인이나 해결방법이 대략적으로 파악이 되었다.
    문제 해결을 위해선 MySQL을 직접 설치하거나,
    Docker를 좀 더 능숙하게 다룰 수 있는 능력이 필요했습니다.

3 - 결과


버전을 내리고 1번 계정의 패스워드 타입 변경 방식을 통해서 서버를 DB를 정상적으로 연결시킬 수 있었습니다.


4. 뭐가 문제였는가. 해결방법은?

참고
https://www.wirebiters.com/mysql-8-4-0-with-docker-compose/
https://dev.mysql.com/doc/relnotes/mysql/8.4/en/news-8-4-0.html
https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html

뭐든 최신버전 사용시 좀 안된다 싶으면 공식문서부터 확인하자.... 메모...x100

Mysql 8.4버전 ReleaseNote의 일부분입니다.
Important Change가 눈에 띕니다.

Important Change: The deprecated mysql_native_password authentication plugin is now disabled by default. It can be enabled by starting MySQL with the new --mysql-native-password=ON server option, or by adding mysql_native_password=ON to the [mysqld] section of your MySQL configuration file.
For more information, see Native Pluggable Authentication. (Bug #36337893)

MySql 8.4버전의 주요 변경점으로
mysql_native_password가 deprecated 되었다고 합니다..
1번방식에서 패스워드 타입을 mysql_native_password 로 변경하였으나
기본 플러그인으로 제공하지 않는 타입이므로 에러가 발생하는 것이였습니다.

문제에 대한 해결방법 역시 공식문서에서 제공하고 있었습니다.
https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html

도커 이미지를 받을때나, MySql 서버를 실행할 때 --mysql-native-password=ON 옵션을 주어 해결할 수 있을것으로 보입니다.

ps
docker pull mysql.... 뒤에 -mysql-native-password=ON 해봤는데 안되더라구요... ( •ᴗ• ;)
결국 옵션주는걸 못해서.. 그냥 버전 내렸어요... ( •ᴗ• ;)

profile
성숙해지려고 노력하지 않으면 성숙하기까지 매우 많은 시간이 걸린다.

0개의 댓글