티스토리 뷰
[Airflow] MySQL 8 버전과 연동시 db init 에러 - 'caching_sha2_password' cannot be loaded
정선생 2023. 4. 28. 00:00MySQL 5.x 버전대에서 MySQL 8.x 버전대로 바뀌면서, yum 에서 MySQL 5.x 를 삭제하고, MySQL 8.x 버전을 재설치후 mysql 명령으로 접근이 가능한걸 확인후, airflow db init 을 했더니 아래와 같은 오류가 발생했다.
인터넷에서는 caching_sha2_password 에서 mysql_native_password 로 구성을 바꾸라는게 대부분의 답변이었는데, 나는 내가 dbms 를 설치한게 아니라 담당자한테 인스턴스만 제공받고 root 권한이 없는 상황이라 인프라 환경을 바꾸지 않고 해결가능한 방법이 있는지 삽질을 했고 결국은 그 원인을 찾아냈다.
(py3) bash-4.2$ airflow db init
[2023-04-25 11:03:35,548] {settings.py:260} DEBUG - Setting up DB connection pool (PID 41781)
...생략...
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 371, in __init__
self.__connect()
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 666, in __connect
pool.logger.debug("Error on connect(): %s", e)
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
compat.raise_(
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
raise exception
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 590, in connect
return dialect.connect(*cargs, **cparams)
File "/home/airflow/py3/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 584, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/home/airflow/py3/lib/python3.9/site-packages/MySQLdb/__init__.py", line 123, in Connect
return Connection(*args, **kwargs)
File "/home/airflow/py3/lib/python3.9/site-packages/MySQLdb/connections.py", line 185, in __init__
super().__init__(*args, **kwargs2)
MySQLdb.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory")
해결방법
결론부터 말하면 MySQL 8 패키지로 변경하여 구성하고, 과거 MySQL 5.x 버전대의 패키지를 잘 삭제후 재설치하면 잘되야한다.
- mysql-community-client
- mysql-community-libs
- mysql-community-devel ==> "mysqlclint" python 라이브러리 설치시 의존성있음
하지만, pip 에서 airflow 관련 패키지를 삭제하고 재설치 해결이 안되었던 이유는,
mysqlclint 파이썬 라이브러리가 과거에 설치된걸 재활용하면서 MySQL8 이 아닌 5버전의 라이브러리를 재사용했기 때문이다.
결과적으로는 pip 의 캐시를 삭제하고 재설치 하니 정상적으로 작동이 가능했다.
% pip cache dir
/home/airflow/.cache/pip
# 위 명령어에서 나온 캐시 폴더를 삭제후 재설치
% rm -rf /home/airflow/.cache/pip/
원인과 테스트
우선 결론부터 말하면, python 의 "mysqlclint 2.1.1" 버전이 과거 MySQL 버전과 꼬여서 나온 문제였다. 가장 손쉽게 테스트해보는 방법이 mysqlclint 를 설치후 아래와 같이 테스트해보면 된다.
>>> import MySQLdb
>>> db = MySQLdb.connect(db='airflow_db', host='mydb.host.com', user='airflow', passwd='암호')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/airflow/py3/lib/python3.9/site-packages/MySQLdb/__init__.py", line 123, in Connect
return Connection(*args, **kwargs)
File "/home/airflow/py3/lib/python3.9/site-packages/MySQLdb/connections.py", line 185, in __init__
super().__init__(*args, **kwargs2)
MySQLdb.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory")
>>>
pip 캐시를 삭제하는 방법을 찾아낸 이유는, 여러대의 서버에서 작업하는데 일부 서버에서는 정상동작하는 현상을 발견했다.
A 서버에서는 caching_sha2_password 오류가 나는데, B서버에서는 잘되는 이상한 상황.
그리고, 세팅이 안된 C 서버에서는 "yum install mysql-community-devel" 를 하기전이었고, 최초 mysqlclint 라이브러리를 설치하면 아래와 같은 의존성 에러가 났는데, 문제가 되는 서버에서는 이런 오류가 없이 설치가 되는게 이상해서 확인해보니 MySQL5 환경에서 설치했던 패키지를 재활용하면서 문제가 되었던걸로 밝혀졌다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 88.1/88.1 kB 25.4 MB/s eta 0:00:00
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [16 lines of output]
/bin/sh: mysql_config: command not found
/bin/sh: mariadb_config: command not found
/bin/sh: mysql_config: command not found
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "/tmp/pip-install-5z_aesdw/mysqlclient_190b1f13f09f45a7a0f52e068e17aed8/setup.py", line 15, in <module>
metadata, options = get_config()
File "/tmp/pip-install-5z_aesdw/mysqlclient_190b1f13f09f45a7a0f52e068e17aed8/setup_posix.py", line 70, in get_config
libs = mysql_config("libs")
File "/tmp/pip-install-5z_aesdw/mysqlclient_190b1f13f09f45a7a0f52e068e17aed8/setup_posix.py", line 31, in mysql_config
raise OSError("{} not found".format(_mysql_config_path))
OSError: mysql_config not found
mysql_config --version
mariadb_config --version
mysql_config --libs
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
별거 아니지만 삽질이 길었던 문제였던것같다.