MWAA-Oracle DB 쿼리 수행 방법

안녕하세요 오늘은 BESPIN GLOBAL DFA실 한제호님이 작성해주신 “MWAA-Oracle DB 쿼리 수행 방법”에 대해 소개해드리도록 하겠습니다.

목차

  1. 개요
  2. Python 언어에서 활용할 수 있는 Oracle Client library 종류
  3. 오류의 원인은?
  4. 해결 방법
  5. 주의사항

1. 개요

  • airflow에서 DB에 쿼리를 수행하기 위해 각 DB 솔루션별 제공하는 Operator를 활용할 수도 있지만 공통으로 제공하는 SQLExecuteQueryOperator를 활용할 수도 있습니다.
  • 구축 환경
    • Airflow: 2.7.2
    • 설치 library: apache-airflow-providers-oracle, oracledb
    • Select 쿼리를 수행할 DB: Oracle 19c
    • DAG 코드
source_task = SQLExecuteQueryOperator(
    task_id='source_task',
    conn_id='oracle_conn',
    sql="select count(*) from test_tb"
)
  • SQLExecuteQueryOperator를 활용하여 Oracle DB 건수 조회를 수행하 였으나 아래와 같은 오류가 발생하였습니다.
    • oracledb.exceptions.NotSupportedError: DPY-3015: password verifier type 0x939 is not supported by python-oracledb in thin mode
  • 본 블로그는 위 오류의 원인을 파악하고 해결할 수 있는 방안에 대해 작성하고자 합니다.
2. Python 언어에서 활용할 수 있는 Oracle Client library 종류
  • cx_Oracle: oracledb 이전 버전의 라이브러리로 해당 라이브리러 설치와 함께 Oracle Client도 같이 설치가 되어야 합니다.
cx_Oracle: oracledb 이전 버전의 라이브러리로 해당 라이브리러 설치와 함께 Oracle Client도 같이 설치가 되어야 한다.
  • oracledb: cx_Oracle 이후 버전의 라이브러리로 앞으로는 해당 라이브러리로 개발하기를 추천합니다.
    • Thick 모드: cx_Oracle와 동일하게 Oracle Client 설치가 필요합니다.
Thick 모드: cx_Oracle와 동일하게 Oracle Client 설치가 필요하다.
  • Thin 모드: Oracle Client 설치가 필요 없습니다.
Thin 모드: Oracle Client 설치가 필요 없다.
  • 제약사항
    • 당연히 간단하게 활용할 수 있는 Thin모드의 경우 제약사항이 있습니다. (DB Startup/Stop, TAF기능 사용, BFILE Type 지원, 21c JSON Data Type 지원, 2PC 등의 기능 사용 불가)

3. 오류의 원인은?

  • 위 내용을 기반으로 airflow의 SQLExecuteQueryOperator는 기본적으로 oracledb의 thin 모드를 사용한다는 것을 알 수 있습니다.
    • 해당 오류는 thin 모드에서는 비밀번호 검증방식을 지원하지 않기 떄문에 발생한 오류로 Oracle 11g 이하에서는 비밀번호에 대한 대소문자 규칙을 판단하지 않았으나 이후 버전에서는 Oracle DB 파라미터중에 “sec_case_sensitive_logon” 값에 따라 패스워드 대소문자 판단 여부가 결정됩니다.
4. 해결 방법
  • 필자가 활용중에 DB에는 sec_case_sensitive_logon 값이 True로 설정되어 있어서 간단한 해겷 방법으로는 해당 값을 False로 설정하면 됩니다.(상황에 따라서는 접속하는 DB 계정의 비밀번호를 다시 생성해야 할 수도 있습니다.)
  • 다만 해당 값을 변경할 수 없는 경우(영향도 파악을 할 수 없는 경우)에는 Client 접속 방식을 Thick 모드로 변경을 해야하는데 이런 경우 MWAA에 Oracle Client 설치가 필요합니다.
  • MWAA 적용 절차
#!/bin/sh
aws s3 cp s3://xxxxxxxx/mwaa/startup/library/libaio-0.3.111-11.amzn2023.0.2.x86_64.rpm  .
aws s3 cp s3://xxxxxxxx/mwaa/startup/library/oracle-instantclient-basic-21.9.0.0.0-1.el8.x86_64.rpm .
aws s3 cp s3://xxxxxxxx/mwaa/startup/library/oracle-instantclient-sqlplus-21.9.0.0.0-1.el8.x86_64.rpm .

sudo dnf install --disablerepo=* -y libaio-0.3.111-11.amzn2023.0.2.x86_64.rpm 
echo "libaio installed"

sudo dnf install --disablerepo=* -y oracle-instantclient-*.rpm
echo "oracle-instantclient installed"
  • 필자가 구축한 MWAA는 인터넷망에 접근이 불가한 구성이기 때문에 설치 파일(rpm) 파일을 S3에 미리 업로드해 두었습니다.
  • startup 스크립트 설치 정상 설치 여부는 Cloudwatch MWAA스케줄러 로그중에 startup 로그를 통해 확인할 수 있습니다.
startup 스크립트 설치 정상 설치 여부는 Cloudwatch MWAA스케줄러 로그중에 startup 로그를 통해 확인할 수 있다.
  • oracledb 라이브러리의 기본 접속방식이 Thin모드이기 때문에 Connection 설정을 통해 Thick 모드로 전환이 필요합니다.
oracledb 라이브러리의 기본 접속방식이 Thin모드이기 때문에 Connection 설정을 통해 Thick 모드로 전환이 필요합니다.
  • 위 설정 이후 정상적으로 데이터 조회가 가능합니다.
5. 주의사항
  • MWAA의 startup 스크립트는 클러스터 구동 시에 최대 5분을 넘길 수 없다. 만약 timeout 에러가 발생한다면 임시방편으로 shell을 background로 구동하는 방법으로 시도해보길 바랍니다.

여기까지 ‘MWAA-Oracle DB 쿼리 수행 방법’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다. 

Written by 한 제호 / DFA실

BESPIN GLOBAL