티스토리 뷰

반응형

MySQL 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.

별거 아니지만 삽질이 길었던 문제였던것같다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함