Print
카테고리: [ Oracle Database ]
조회수: 22766

Oracle Document에 따르면 11gR2 설치를 지원하는 리눅스는 아래와 같습니다.(https://docs.oracle.com/cd/E11882_01/install.112/e24324/toc.htm#CHDGGFJH)

Asianux Server 3 SP2, Asianux Server 4 SP3
Oracle Linux 4 Update 7, Oracle Linux 5 Update 2, Oracle Linux 6
Red Hat Enterprise Linux 4 Update 7, Red Hat Enterprise Linux 5 Update 2, Red Hat Enterprise Linux 6
SUSE Linux Enterprise Server 10 SP2, SUSE Linux Enterprise Server 11
 
그러나 위의 Linux를 설치하려면 라이센스가 필요하기 때문에 저는 제 노트북에 설치 되어 있는 Ubuntu를 이용하기로 하였습니다.
 
# OS version
durecat@:~$ uname -a
Linux durecat-Satellite-L510 3.16.0-71-generic #92~14.04.1-Ubuntu SMP Thu May 12 23:34:38 UTC 2016 i686 i686 i686 GNU/Linux

 

지원되지 않는 리눅스 이기 때문에 설치 과정이 쉽지는 않습니다만, XE 버전 보다는 Standard나 Enterprise를 사용하고 싶었기 때문에 구글링을 통해 설치를 하였습니다. 

 

기본적으로 설치해야 하는 패키지와 환경 세팅은 아래 링크를 참조 하였습니다.

http://makina-corpus.com/blog/metier/archives/howto-install-oracle-11g-ubuntu-linux-1204-precise-pangolin-64bits

 

위 페이지의 instruction 이후 해결한 에러들에 대해 정리해 보려 합니다.

# Running runInstaller

GUI Installation 화면을 뛰우기 위해 xhost + 설정 후 runInstaller를 실행 합니다. 

--root 계정으로 로그인합니다.
durecat@:~$ sudo -i
[sudo] password for durecat:
root@:~# xhost +
access control disabled, clients can connect from any host

--oracle 계정으로 로그인합니다.
root@:~# su - oracle

--DISPLAY 설정 후 runInstaller를 기동합니다.
oracle@:~$ export DISPLAY=:0.0
oracle@:~$ cd database/
oracle@:~/database$ ls
doc  install  response    rpm  runInstaller  sshsetup  stage  welcome.html
oracle@:~/database$ ./runInstaller
Starting Oracle Universal Installer...

이제 GUI 화면이 나타납니다. 

 

저는 매뉴얼하게 디비 생성하기 위해 엔진 설치만 선택했습니다.

Grid Options -> Single Instance Database Installation

Product Language -> English, Korean

Database Edition -> Standard (Enterprise 하려 하다 잘 못 선택했네요 ;)

참고로 Enterprise 로 설치 시 선택할 수 있는 Components 입니다.

 

Installation Location, Oracle Inventory, Operating System Groups 설정 후 이제 대망의 Prerequisite Checks 입니다. 

라이브러리 관련 에러가 많이 뜹니다. 에러에 너무 당황한 나머지 스크린 샷이 없네요 ㅋ. 

저는 Ignore all 을 우선 선택하여 진행하였습니다. 설치 중에 에러 나면 처리하기로 하구요.. 

 

라이브러리 관련 에러가 역시 발생합니다. 

처리 방법은 생각보다 간단합니다. 이미 위에서 관련있는 패키지들을 많이 설치하였기 때문에 라이브러리는 존재 하는데 Oracle이 찾는 위치에 없는 경우가 대부분입니다.

locate 명령어를 통해 Oracle이 요구하는 라이브러리의 위치를 파악 후 하드링크를 Oracle이 요구하는 위치에 만들어 줍니다. (아래 링크 참조)

https://gemsofprogramming.wordpress.com/2013/09/19/installing-oracle-12c-on-ubuntu-12-04-64-bit-a-hard-journey-but-its-worth-it/

# Error 1

우선 설치 로그 파일을 확인하여 어떤 라이브러리를 못 찾는지 확인합니다.

INFO: /opt/oracle/app/oracle/product/11.2.0/dbhome_1/bin/genclntsh
INFO: /
INFO: usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a
INFO: collect2: error: ld returned 1 exit status
INFO: genclntsh: Failed to link libclntsh.so.11.1
INFO: make: *** [client_sharedlib] Error 1
INFO: End output from spawned process.

locate와 ln 명령어를 이용해 하드링크를 생성해 줍니다.

root@:/opt/oracle/app/oraInventory/logs# locate libpthread_nonshared
/usr/lib/i386-linux-gnu/libpthread_nonshared.a

# ln -s /usr/lib /usr/lib/lib64

root@:/opt/oracle/app/oraInventory/logs# ln /usr/lib/i386-linux-gnu/libpthread_nonshared.a /usr/lib/libpthread_nonshared.a

 

#Error 2

역시 유사한 라이브러리 에러가 납니다. 같은 방법으로 처리합니다.

INFO: /opt/oracle/app/oracle/product/11.2.0/dbhome_1/bin/genclntsh
INFO: /usr/bin/ld: cannot find /usr/lib/libc_nonshared.a
INFO: collect2: error: ld returned 1 exit status
INFO: genclntsh: Failed to link libclntsh.so.11.1
INFO: make: *** [client_sharedlib] Error 1
INFO: End output from spawned process.

 

root@:/opt/oracle/app/oraInventory/logs# locate libc_nonshared.a
/usr/lib/i386-linux-gnu/libc_nonshared.a

root@d:/opt/oracle/app/oraInventory/logs# ln /usr/lib/i386-linux-gnu/libc_nonshared.a /usr/lib/libc_nonshared.a


#Error 3

이번에는 emdctl 관련하여 에러가 납니다. ORACLE_HOME 환경변수를 제대로 설정하지 않고 설치를 해서 발생한 듯합니다.

(참고 링크: https://community.oracle.com/thread/2461988?tstart=0)

INFO: collect2: error: ld returned 1 exit status
INFO: make[1]: Leaving directory `/opt/oracle/app/oracle/product/11.2.0/dbhome_1/sysman/lib'
INFO: make[1]: *** [/opt/oracle/app/oracle/product/11.2.0/dbhome_1/sysman/lib/emdctl] Error 1
INFO: make: *** [emdctl] Error 2
INFO: End output from spawned process.

 

oracle@:~/app/oracle/product/11.2.0/dbhome_1$ export ORACLE_HOME=/opt/oracle/app/oracle/product/11.2.0/dbhome_1
oracle@:~/app/oracle/product/11.2.0/dbhome_1$ echo $ORACLE_HOME
/opt/oracle/app/oracle/product/11.2.0/dbhome_1
oracle@:~/app/oracle/product/11.2.0/dbhome_1$ sed -i 's/^\(\s*\$(MK_EMAGENT_NMECTL)\)\s*$/\1 -lnnz11/g' $ORACLE_HOME/sysman/lib/ins_emagent.mk
oracle@:~/app/oracle/product/11.2.0/dbhome_1$ sed -i 's/^\(\$LD \$LD_RUNTIME\) \(\$LD_OPT\)/\1 -Wl,--no-as-needed \2/g' $ORACLE_HOME/bin/genorasdksh
oracle@:~/app/oracle/product/11.2.0/dbhome_1$ sed -i 's/^\(\s*\)\(\$(OCRLIBS_DEFAULT)\)/\1 -Wl,--no-as-needed \2/g' $ORACLE_HOME/srvm/lib/ins_srvm.mk
oracle@:~/app/oracle/product/11.2.0/dbhome_1$ sed -i 's/^\(TNSLSNR_LINKLINE.*\$(TNSLSNR_OFILES)\) \(\$(LINKTTLIBS)\)/\1 -Wl,--no-as-needed \2/g' $ORACLE_HOME/network/lib/env_network.mk
oracle@:~/app/oracle/product/11.2.0/dbhome_1$ sed -i 's/^\(ORACLE_LINKLINE.*\$(ORACLE_LINKER)\) \(\$(PL_FLAGS)\)/\1 -Wl,--no-as-needed \2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk

 

#Error 4

라이브러리 관련 마지막 에러 입니다.

하드링크 생성시 주의하셔야 할 점은 locate로 파일 검색 시 여러개의 파일이 검색 되었다면, 결과 중 이미 링크로 사용되고 있는 파일로 다시 링크를 만들면 안된다는 것입니다.

저의 경우 처음에 이름이 동일한 libstdc++.so.6를 이용해 하드링크를 생성하였으나 지속적으로 에러가 발생하여 파일등을 살펴 보니 libstdc++.so.6 역시 링크 였고

원본은 libstdc++.so.6.0.19 이어서 이 파일을 이용하여 링크를 생성해 주니 에러가 해결되었습니다.

INFO: Creating /opt/oracle/app/oracle/product/11.2.0/dbhome_1/lib/liborasdkbase.so.11.1
INFO: gcc: error: /lib/libgcc_s.so.1: No such file or directory
gcc: error: /usr/lib/libstdc++.so.6: No such file or directory
INFO: /opt/oracle/app/oracle/product/11.2.0/dbhome_1/bin/genorasdksh: Failed to link liborasdkbase.so.11.1
INFO: make: *** [liborasdkbase] Error 1
INFO: End output from spawned process.

 

root@durecat-Satellite-L510:/opt/oracle/app/oraInventory/logs# locate libgcc_s.so.1
/lib/i386-linux-gnu/libgcc_s.so.1
root@durecat-Satellite-L510:/opt/oracle/app/oraInventory/logs# ln /lib/i386-linux-gnu/libgcc_s.so.1 /lib/libgcc_s.so.1

root@durecat-Satellite-L510:/opt/oracle/app/oraInventory/logs# locate libstdc++.so.6
/usr/lib/i386-linux-gnu/libstdc++.so.6
/usr/lib/i386-linux-gnu/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib/i386-linux-gnu/libstdc++.so.6.0.19-gdb.py
-- /usr/lib/i386-linux-gnu/libstdc++.so.6 역시 링크 이므로 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19 하드링크 생성해야 함
root@durecat-Satellite-L510:/opt/oracle/app/oraInventory/logs# ln /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19 /usr/lib/libstdc++.so.6

 

마지막으로 두개의 sh 파일을 root로 실행하고 나면, 드디어 성공적으로 설치가 완료되었다는 메시지가 나타납니다.


 

끝으로 ,profile에 환경변수 세개를 설정하고 sqlplus를 실행해 봅니다.

export ORACLE_HOME="/opt/oracle/app/oracle/product/11.2.0/dbhome_1"
export ORACLE_BASE="/opt/oracle"
export PATH=$PATH:/opt/oracle/app/oracle/product/11.2.0/dbhome_1/bin

$. ./.profile
oracle@:~$ sqlplus

SQL*Plus: Release 11.2.0.1.0 Production on Sun Jul 10 22:54:07 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Enter user-name: ^C

sqlplus가 잘 실행이 되는 것을 확인 할 수 있습니다. 

Ubuntu가 Oracle에서 지원하는 리눅스가 아니기 때문에 커널값등의 호환성 문제로 디비 생성 및 기동에 문제가 있을 수 있을 것 같은데요..

디비 생성 중 혹시 에러를 또 만나게 되면 공유하겠습니다.