2021. 8. 1. 17:46ㆍComputer 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
이렇게 했는데도 안된다? 괜찮다.
그러면 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/
해당 환경변수가 잘 설정되었는지 확인하려면 다음과 같은 명령어를 입력하면 된다.
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
2. oracle installation manual
https://oracle.github.io/odpi/doc/installation.html#macos
'Computer Science' 카테고리의 다른 글
[프로그래머스 C++] 게임 맵 최단거리 (0) | 2022.07.21 |
---|---|
[백준 1922번 C++] 네트워크 연결 (0) | 2022.07.21 |
kernel에 system call 추가[ubuntu] (6) | 2020.12.28 |
비전공자의 데이터 분석 준 전문가(ADSP) 독학 후기 (0) | 2020.12.24 |
Virtual box 가상광디스크 삽입 문제 (0) | 2020.11.10 |