파이썬 오라클 연동 오류 (cx_Oracle error. DPI-1047)

2021. 8. 1. 17:46Computer Science

종종 데이터 분석을 하다보면, 분석한 결과물을 직접 오라클 데이터 베이스에 올려야 하는 상황이 있다.

그중에서도 DPI-1047 에러는 윈도우 운영체제의 파이썬에서 직접 오라클과 연결하는 과정에서 설치된 라이브러리의 경로를 제대로 파악하지 못하는 경우 발생하는 에러이다.

대략 3일 간 구글링을 해본 결과..기본적으로 DPI-1047에러에 대한 모든 문제점의 원인과 해결방안을 찾아 오랜만에 블로그에 정리해보고자 한다.


Oracle client instant library를 설치하는 데에서 발생하는 문제의 원인(메뉴얼대로 제대로 했는데도 안된다면)은 거의 아래와 동일하다.

1. 64bit / 32bit 인지 제대로 확인하였는가? (종종 가상환경 내 환경이 다른 경우도 있다고 ..?)
2. 경로를 제대로 작성하였는가?(절대 경로 / 상대 경로 확인 필수)
3. 올바른 가상환경(conda, 이외 기타 본인이 생성한 환경 등)에서 제대로 CX_ORACLE을 설치했는가?


위의 사항에 해당되지 않는다면, 백이면 백 메뉴얼에서 실수를 한 것이다.
지금부터 천천히 메뉴얼대로 실행을 해보자!


가장 첫째로, cx_oracle 을 설치한다.

pip install cx_oracle #그리고 종종 cx_oracle의 버전이 다른 경우가 있으니 버전 업그레이드도 해본다 
python -m pip install cx_Oracle --upgrade


이후, 본인의 컴퓨터 사양에 맞는 oracle client library 를 설치한다.(https://www.oracle.com/kr/database/technologies/instant-client/downloads.html)

여기서 하라는대로 설치를 하고나면 zip 파일이 떨어지는데, 이걸 본인이 원하는 디렉토리 안에 떨군다음 리눅스 커멘드 창에서 아래와 같은 방식으로 zip파일을 풀면 된다.
(근데 거의 대부분의 메뉴얼에서 opt/oracle 디렉토리 안에 zip파일을 해체한다.)

mkdir -p opt/oracle cd opt/oracle unzip oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.zip

이후, libaio1 이라는 패키지를 설치해주어야 한다.

sudo apt-get install libaio1

파일을 해체한 후 libclntsh.so 파일이 있는지 확인해보자(당연히 있겠지..)
파일이 제대로 있다면, 이제 경로 설정으로 파이썬이 해당 파일을 인식할 수 있게만 해주면 된다!

이제 다운받은 oracle client instant library의 경로를 환경변수로 설정해주자.
환경 변수로 설정하는 방식에는 여러 가지 방식이 있다.

(1) /etc/profile 파일에 환경변수를 입력해주거나 (2) bashrc파일에 환경변수를 입력해주는 방식이 있다.
하지만 어차피 하다보면 경로 인식 못해서 골머리 썩힐게 뻔하니 걍 둘다 해보자.
(아 ㅋㅋ 일단 돌아가면 된다고 ㅋㅋ)

첫번째로, /etc/profile파일에 환경변수를 입력하는 방식이다.
(etc/profile은 홈 디렉토리 하위에 존재한다. etc 디렉토리 내 파일을 확인해보고 싶으면 cd 치고 아래로 내려가다보면 나온다)

vi /etc/profile #vi 에디터로 profile파일 실행 
export LD_LIBRARY_PATH='insert your path'$:LD_LIBRARY_PATH #profile 파일 가장 하단에 상단 명령어를 입력한다. 경로에는 본인의 라이브러리가 존재하는 경로를 적어주면 된다. source /etc/profile #profile 파일 내 입력한 환경변수를 적용한다

두번째로, bashrc파일에 환경변수를 입력하는 방식이다.

vi ~/.bashrc #bashrrc 파일 실행 

export LD_LIBRARY_PATH='insert your path':$LD_LIBRARY_PATH 

source ~/.bashrc 
#bashrc파일 내의 환경변수 적용

시스템 전역환경변수 등록에 대해 더 궁금한 점이 있다면 하단 블로그를 참고하는 것을 추천한다.
https://www.leafcats.com/249

리눅스 환경설정 파일 정리, 리눅스 source 명렁어

/etc/profile : 시스템 전역 쉘 변수 user가 쉘에 로그인 하게 되면 가장 먼저 /etc/profile파일을 읽는다. /etc/profile 파일에는 USER, LOGNAME, HOSTNAME 등의 쉘 변수들이 선언되어 있다. /etc/profile 파일을..

www.leafcats.com

이렇게 했는데도 안된다? 괜찮다.
그러면 LD_LIBRARY_PATH를 직접 설정해보자!

sudo vi /etc/ld.so.conf.d/oracle_instant_client.conf #etc/ld.so.conf.d 디렉토리 내에 oracle instant client 를 인식할수있는 설정파일을 생성한다. 

/opt/oracle/instantclient_21_1 #oracle_instant_client.conf 내에 해당 경로를 직접 입력한다. 

sudo ldconfig -v #파일 저장 후 해당 명령어로 설정파일을 적용한다.

oracle에서 제공하는 메뉴얼은 위의 방식이랑 크게 다른 것은 없지만 간단하므로 일단 적어놓도록 하겠다.
(둘 중에 맘에 드는 코드로 실행해도 괜찮을듯)

sudo sh -c "echo /opt/oracle/instantclient_21_1 > /etc/ld.so.conf.d/oracle-instantclient.conf" 

sudo ldconfig

만약 이랬는데도 같은 에러가 발생한다?
이번에는 /opt/oracle/instantclient_21_1 내에 network/admin 디렉토리를 생성후 tnsnames.ora 혹은 sqlnet.ora, oraaccess.xml을 저장해준다. (해당 파일은 개인 서버의 양식에 맞춰 vi 에디터로 생성해주면 된다.)

mkdir -p network/admin 

sudo vi tnsnames.ora

tnsnames.ora 파일 생성에 대해 궁금하다면 하단 블로그를 참고하는게 좋을 것 같다.
https://idjung.wordpress.com/2020/11/18/oracle-instant-client-%EC%84%A4%EC%B9%98/

Linux에 ORACLE Instant Client 설치

배경 ORACLE을 이용하는 프로그램을 개발하려면, ORACLE Client를 설치해야 한다. ORACLE Client 설치 프로그램은 GUI 환경에서 실행되기 때문에, 리눅스에 ORACLE Client를 설치하기 위해 Server with GUI 옵션으

idjung.wordpress.com


해당 환경변수가 잘 설정되었는지 확인하려면 다음과 같은 명령어를 입력하면 된다.

echo $LD_LIBRARY_PATH

만약 해당 명령어를 입력했는데 아무것도 출력되지 않는다면, 상단 메뉴얼 실행 중 뭔가 빠트린거다. (적용 명령어를 실행을 안했거나) 다시 처음부터 차근차근해보자.

이 외에도 구차한 방법으로는, 본인의 파이썬 스크립트가 돌아가는 커널(가상환경)내에 oracle client instant library를 복사 붙여넣기 하는 방법이 있다. (github에서 알려줌)

다시 한번 언급하지만, 본인이 적은 LD_LIBRARY_PATH가 올바른 경로인지 꼭 확인하기 바란다!
(나도 첨에 opt/oracle..이렇게 적어서 안됐었는데 절대경로로 입력하니 바로 해결되었다. 노어이..멍청한 쉑 ㅠㅠ)

이렇게 한 단계씩 성장하는게 아닐까..하는 그런 생각이 든다. 나때문에 덩달아 야근한 사수님께 죄송할 뿐.

아래는 내가 도움을 받았던 레퍼런스들이다. 참고해서 하면 좋을 듯하다!

P.S 글이 도움이 되셨다면 좋아요 눌러주세요🥺
저에게 큰 도움이 되고 있습니다🙆🏻‍♀️🙆🏻‍♀️

1. oracle client instant library manual
https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html

cx_Oracle 8 Installation — cx_Oracle 8.3.0-dev documentation

© Copyright 2016, 2020, Oracle and/or its affiliates. All rights reserved. Portions Copyright © 2007-2015, Anthony Tuininga. All rights reserved. Portions Copyright © 2001-2007, Computronix (Canada) Ltd., Edmonton, Alberta, Canada. All rights reserved R

cx-oracle.readthedocs.io

2. oracle installation manual
https://oracle.github.io/odpi/doc/installation.html#macos

ODPI-C Installation — ODPI-C v4.2.1

To use ODPI-C in your own project, download its source from GitHub. A sample Makefile is provided if you wish to build ODPI-C as a shared library. Otherwise, add the ODPI-C source code to your project. On Windows, Visual Studio 2008 or higher is required.

oracle.github.io

반응형