안녕하세요 오늘은 BESPIN GLOBAL DFA실 한제호님이 작성해주신 “MWAA-Oracle DB 쿼리 수행 방법”에 대해 소개해드리도록 하겠습니다.
목차
개요
Python 언어에서 활용할 수 있는 Oracle Client library 종류
오류의 원인은?
해결 방법
주의사항
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도 같이 설치가 되어야 합니다.
oracledb: cx_Oracle 이후 버전의 라이브러리로 앞으로는 해당 라이브러리로 개발하기를 추천합니다.
Thick 모드: cx_Oracle와 동일하게 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 설치가 필요합니다.