Translate

[Docker] Oracle 12c 구성 및 사용하기 (Oracle 공식 배포버전)




==============================
2019.11.13 추가

본 글은 작업이 가능한 오라클을 구성(설치) 하는 개념이며
프로젝트의 오라클 개발DB와 동일한 환경을 구성하기 위해서는 본 글을 훓어보고 아래의 링크의 글을 읽어보길 권한다.
링크 - [Docker] 개발DB Oracle 환경을 로컬에 그대로 구축하는 방법
==============================

오라클 로컬 서버가 필요해져서 도커로 설치하는 방법을 알아보았다.
도커를 처음해보다보니 시간이 걸리긴 했지만 알고나니 금방 할 수 있는 작업이었다.



전제조건
도커허브(https://hub.docker.com/)에서 도커를 다운로드 받아 설치 및 로그인이 되어있다는 가정하에 작업을 하겠다.





작업 방법

1. Docker - Oracle Database Enterprise Edition 사이트에서 체크아웃을 진행한다.
  - 링크: https://hub.docker.com/_/oracle-database-enterprise-edition?tab=resources




정보를 입력 후 아래와 같은 화면이 나오며 이미지를 checkout 받을 수 있는 링크가 보여진다.
 - docker pull store/oracle/database-enterprise:12.2.0.1




스크롤을 마지막까지 내리면 몇개의 기능이 빠진 slim 버전을 제공하는데 나는 이 버전으로 테스트를 진행을 했다.






2. 커맨드 창에서 도커 이미지 체크아웃/구동 후 Oracle 접속 계정을 생성한다.

아래에도 나오겠지만 설치되는 오라클의 기본정보는 다음과 같다.

USER = sys / Oradoc_db1
DB_SID=ORCLCDB
DB_PDB=ORCLPDB1
DB_MEMORY=2GB
DB_DOMAIN=localdomain



Microsoft Windows [Version 10.0.18362.418]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\1004lucifer>
# 현재 사용중인 도커 버전
C:\Users\1004lucifer>docker --version
Docker version 19.03.1, build 74b1e89

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 도커 로그인이 되어있어야 한다.
C:\Users\1004lucifer>docker login
Authenticating with existing credentials...
Login Succeeded

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 이미지 체크아웃
C:\Users\1004lucifer>docker pull store/oracle/database-enterprise:12.2.0.1-slim
12.2.0.1-slim: Pulling from store/oracle/database-enterprise
4ce27fe12c04: Pull complete
9d3556e8e792: Pull complete
fc60a1a28025: Pull complete
0c32e4ed872e: Pull complete
be0a1f1e8dfd: Pull complete
Digest: sha256:dbd87ae4cc3425dea7ba3d3f34e062cbd0afa89aed2c3f3d47ceb5213cc0359a
Status: Downloaded newer image for store/oracle/database-enterprise:12.2.0.1-slim
docker.io/store/oracle/database-enterprise:12.2.0.1-slim

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 이미지가 정상적으로 받아졌는지 확인
C:\Users\1004lucifer>docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
store/oracle/database-enterprise   12.2.0.1-slim       27c9559d36ec        2 years ago         2.08GB

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 해당 이미지를 컨테이너로 구동
C:\Users\1004lucifer>docker run -dit --name local_db -p 1521:1521 store/oracle/database-enterprise:12.2.0.1-slim
048cd97b8e0f2c8b8131a0b3c6addf24761e276a85b1ab92cac482b6ce009d63

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 컨테이너가 정상적으로 구동되었는지 확인
C:\Users\1004lucifer>docker ps -a
CONTAINER ID        IMAGE                                            COMMAND                  CREATED             STATUS                   PORTS                              NAMES
048cd97b8e0f        store/oracle/database-enterprise:12.2.0.1-slim   "/bin/sh -c '/bin/ba…"   4 minutes ago       Up 4 minutes (healthy)   0.0.0.0:1521->1521/tcp, 5500/tcp   local_db

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 컨테이너의 로그 확인
C:\Users\1004lucifer>docker logs -f local_db
Setup Oracle Database
Oracle Database 12.2.0.1 Setup
Mon Nov 4 14:23:45 UTC 2019

Check parameters ......
log file is : /home/oracle/setup/log/paramChk.log
paramChk.sh is done at 0 sec

untar DB bits ......
log file is : /home/oracle/setup/log/untarDB.log
untarDB.sh is done at 78 sec

config DB ......
log file is : /home/oracle/setup/log/configDB.log
Mon Nov 4 14:25:03 UTC 2019
Start Docker DB configuration
Call configDBora.sh to configure database
Mon Nov 4 14:25:03 UTC 2019
Configure DB as oracle user
Setup Database directories ...

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 4 14:25:04 2019

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

Connected to an idle instance.

SQL>
File created.

SQL> ORACLE instance started.

Total System Global Area 1342177280 bytes
Fixed Size                  8792536 bytes
Variable Size             352323112 bytes
Database Buffers          973078528 bytes
Redo Buffers                7983104 bytes
Database mounted.
Database opened.
SQL>
Database altered.

... 생략 ...

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

DONE!
Remove password info
Docker DB configuration is complete !
configDB.sh is done at 122 sec

Done ! The database is ready for use . <= 이부분이 나오면 정상

... 생략 ...

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# Oracle 접속 계정 생성
C:\Users\1004lucifer>docker exec -it local_db bash -c "source /home/oracle/.bashrc; sqlplus sys/Oradoc_db1@ORCLCDB as sysdba"

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 4 14:42:37 2019

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> # Oracle 12C 에서 사용자 생성 시 기존과 같은 방법으로 만들기 위해 사용
SQL> alter session set "_ORACLE_SCRIPT"=true;

Session altered.

SQL> # 사용자 생성 (lucifer / 1234)
SQL> create user lucifer identified by 1234;

User created.

SQL> # 권한 할당
SQL> grant connect, resource, dba to lucifer;

Grant succeeded.

SQL>




위와같이 작업을 해주면 로컬에 DB접속이 가능하다.




하지만 다음과 같은 문제가 있다.

1. SYSDATE 사용 시 현재시간과 맞지 않는다.




2. 한글을 정상적으로 사용할 수 없다.






3. 시간을 맞추고 한글을 정상적으로 이용할 수 있도록 작업한다.



C:\Users\1004lucifer>
# 기존 .bashrc 파일의 내용을 확인한다.
C:\Users\1004lucifer>docker exec -it local_db bash -c "cat /home/oracle/.bashrc"
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export OH=/u01/app/oracle/product/12.2.0/dbhome_1
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/u01/app/oracle/product/12.2.0/dbhome_1/bin
export TNS_ADMIN=/u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB
export ORACLE_SID=ORCLCDB;

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 타임존 설정을 추가한다.
C:\Users\1004lucifer>docker exec -it local_db bash -c "echo \"export TZ='Asia/Seoul'\" >> /home/oracle/.bashrc"

C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 설정이 추가되었는지 확인
C:\Users\1004lucifer>docker exec -it local_db bash -c "cat /home/oracle/.bashrc"
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export OH=/u01/app/oracle/product/12.2.0/dbhome_1
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/u01/app/oracle/product/12.2.0/dbhome_1/bin
export TNS_ADMIN=/u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB
export ORACLE_SID=ORCLCDB;
export TZ='Asia/Seoul'

C:\Users\1004lucifer>
C:\Users\1004lucifer>
C:\Users\1004lucifer>
C:\Users\1004lucifer>
C:\Users\1004lucifer>
# 한글 사용을 위해 작업해준다.
C:\Users\1004lucifer>docker exec -it local_db bash -c "source /home/oracle/.bashrc; sqlplus sys/Oradoc_db1@ORCLCDB as sysdba"

SQL*Plus: Release 12.2.0.1.0 Production on Tue Nov 5 00:46:46 2019

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

Last Successful login time: Mon Nov 04 2019 23:42:37 +09:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
SQL> update sys.props$ set value$='KOREAN_KOREA.UTF8' where name='NLS_LANGUAGE';

1 row updated.

SQL> update sys.props$ set value$='UTF8' where name='NLS_CHARACTERSET';

1 row updated.

SQL> update sys.props$ set value$='UTF8' where name='NLS_NCHAR_CHARACTERSET';

1 row updated.

# 위의 UTF-8을 사용시 한글 1글자에 3byte가 사용되며 2byte사용을 원하는경우 아래의 쿼리로 업데이트를 해줘야 한다.
update sys.props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET';
update sys.props$ set value$='KO16MSWIN949' where name='NLS_NCHAR_CHARACTERSET';
update sys.props$ set value$='AMERICAN_AMERICA.KO16MSWIN949' where name='NLS_LANGUAGE';
# 참고: https://blog.naver.com/ssarmang/20209683055




SQL> commit;

Commit complete.

SQL> shutdown; (shutdown immediate; 명령어 권장)
Database closed.
Database dismounted.
ORACLE instance shut down.
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


Warning: You are no longer connected to ORACLE.
SQL>
SQL> startup;
SP2-0640: Not connected
SQL>
SQL> conn / as sysdba
Connected to an idle instance.
SQL>
SQL> startup;
ORACLE instance started.

Total System Global Area 1342177280 bytes
Fixed Size                  8792536 bytes
Variable Size             369100328 bytes
Database Buffers          956301312 bytes
Redo Buffers                7983104 bytes
Database mounted.
Database opened.
SQL>
SQL>


PS.
작업 중 shutdown; 시간이 너무 오래걸려 SQL Developer의 세션을 끊었는데 shutdown이 바로 완료가 되었다. 세션이 잡혀있어서 shutdown이 안되고 있었는지 아니면 우연히 타이밍 좋게 그때 끝난건지는 잘 모르겠다.
찾아보니 아마 shutdown immediate; 명령어를 사용하지 않아서 연결되어있는 세션때문에 종료되지 않은듯 추측이 된다.


위와같이 작업 후 시간, 한글 이슈가 해결된 것을 확인할 수 있다.





참고
 - http://open-but-closed.com/install-oracle-database-with-docker-on-google-cloud-platform/
 - https://keichee.tistory.com/m/23?category=834899

댓글

  1. 답글
    1. 도움이 된것 같아서 기분이 좋네요 ;)

      삭제
  2. 도움이 많이되었습니다. 정말감사합니다. 다만 타임존부분에서 저는 'Asia/Seoul' 로는 적용이 안되고 ''를 빼야적용되네요 ㅎㅎ

    답글삭제
    답글
    1. 같은 이미지로 방법이 다르다니 이상하지만 잘 되었다고 하시니 다행입니다. ㅎㅎ

      삭제
  3. 좋은 참고글 감사합니다.
    처음부터 끝까지 정리를 아주 잘해놓으셨네요.

    답글삭제
    답글
    1. 힘이되는 댓글이네요. 고맙습니다. ^^

      삭제
  4. 감사합니다. 정말 알기 쉽게 정리해주셨네요. 덕분에 많은 도움이 되었습니다.

    답글삭제
    답글
    1. 도움이 되었다고 하니 기분이 좋네요. 감사합니다. ^^

      삭제

댓글 쓰기