DB/Oracle

[Oracle, macOS] Docker를 이용한 Oracle Database 11gR2 XE 설치 및 실행하기(SQLPlus, DataGrip 접속 및 SCOTT 계정 생성)

EARTH_ROOPRETELCHAM 2022. 5. 5. 15:43
728x90
반응형

들어가기 전에

기본적으로, Apple Silicon(ARM 아키텍처를 사용해 애플이 설계한 프로세서)이 적용된 M1 맥북(M1 pro 포함)의 경우 oracle database 설치가 불가능합니다. 따라서, M1 맥북 사용자라면 로컬이 아닌 외부에 ORACLE 데이터베이스를 구성하시어 사용하시길 바랍니다.

이번 포스팅에서는, 사내에서 사용하고 있는 Oracle Database 버전인 Oracle Database 11g를 설치하는 법에 대해 알아보고자 합니다. 추가적으로, SQLPlus 실행과 Datagrip에서 Oracle Database에 접근하는 방법도 알아보겠습니다. 또한, Oracle Database 실습을 위한 학습용 계정인 SCOTT 계정 생성까지 진행해보도록 하겠습니다.

만약, Oracle Database 18c XE 버전을 설치하고자 한다면, 하기 포스팅을 보시면 됩니다.

필자가 사용하고 있는 맥북 프로 스펙은 하기와 같습니다.

오라클 데이터베이스 설치

기본적으로, oracle database의 경우 mySQL처럼 macOS에서 바로 설치가 되지 않아 docker에 띄워서 사용해야 합니다. 이번 포스팅은 docker가 설치되어 있다고 가정하고 진행합니다. 만약, docker가 설치되어 있지 않다면 하기 포스팅을 참고하시어 docker를 먼저 설치하시고 포스팅을 읽어주셔야 원할하게 oracle database 설치가 가능합니다.

Oracle Database 11gR2 XE (11.2.0.2) 설치하기

기존에 Oracle Database 18c XE 설치했던 것처럼, Oracle 사가 제공하는 Dockerfile을 이용하여 설치하고자 하였습니다.

https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance

하지만, 해당 레포지토리의 README.md를 읽어보았을 때 18c XE와 달리 11gR2는 installation binaries of Oracle Database를 받아서 dockerfiles/에 넣어야 한다고 적혀있었습니다. Oracle Technology Network 페이지를 통해 해당 binaries를 받을 수 있다고 적혀있지만, 실제로 해당 페이지를 접근하면 Previous Database Release Software의 경우, 유효한 Oracle Database product license가 있어야만 다운로드가 가능했습니다.

Oracle Technology Network 내 Previous Database Release Software 다운로드하는 법

이에, dockerhub에서 일반 사용자가 생성한 이미지인, wnameless/oracle-xe-11g-r2를 통해 Oracle Database 11gR2 XE를 설치하고자 합니다.

https://hub.docker.com/r/wnameless/oracle-xe-11g-r2

먼저, PC에 설치된 Docker를 띄운 후 터미널에 접속합니다. wnameless/oracle-xe-11g-r2 이미지를 땡겨오기 위한 명령어(docker pull wnameless/oracle-xe-11g-r2)를 복사하여 터미널에 넣어 이미지를 다운로드 합니다. 다운로드가 완료되면 docker images 명령어를 통해 설치된 Oracle Database 11gR2 이미지를 확인할 수 있습니다.

Oracle Database 11gR2 설치하기

이제 다운로드한 이미지를 이용해 컨테이너를 생성 및 실행해보도록 하겠습니다. 컨테이너 생성 및 실행은 아래 명령어로 진행할 수 있습니다.

docker run --name [container명] \
> -d \
> -p 51521:1521 \
> -p 55500:5500 \
> [REPOSITORY명]
  • -name [container명]: 컨테이너의 이름을 작성하는 부분입니다.
  • -d: 컨테이너를 백그라운드로 구동합니다.
  • -p [호스트OS 포트]:[container 포트]: 호스트OS 포트를 container 포트에 매핑하는 것입니다.
    • Oracle DB의 default TCP 포트가 1521이므로, 위에서 container 포트는 1521를 작성하였고, 호스트OS 포트에는 container 포트 앞에 5를 추가로 붙여 매핑하였습니다.
    • 5500 포트는 EM Express라는 무료 DB 관리 도구의 default 포트로, 호스트OS 포트와 미리 매핑해두었습니다.

실제 container 구동 예시 및 docker ps로 확인 가능한 컨테이너 상태(왼쪽) 및 container run 결과(오른쪽)

SQLPlus 실행하기

SQLPlus는 Oracle Database 접속용 프로그램으로 Oracle Database 설치 시 함께 설치됩니다. Oracle Database를 컨테이너로 띄워둔 상태에서 아래 명령어를 이용하면 SQLPlus를 실행할 수 있습니다.

  • docker exec -it [컨테이너명] bash: SQLplus를 실행할 수 있는 환경에 접근합니다.
  • sqlplus system/oracle: SQLPlus를 실행합니다.
    • system: Oracle Database에 접근하는 계정(관리자 계정)
    • oracle: Oracle Database 설치시 지정한 비밀번호
    • system 계정은 Oracle Database의 최고 권한을 가진 SYS 계정의 데이터베이스 관리 권한을 위임받은 관리용 계정으로, DBA가 아니면 사용할 일이 거의 없습니다.
  • sqlplus 종료는 exit을 통해 진행(bash 역시 exit으로 종료)할 수 있으며, 존재하는 모든 테이블을 출력하고자 할 경우, select * from tab; 명령어를 사용하면 됩니다.

SQLPlus 실행하기

  • 사용하는 docker 이미지에 따라 sqlplus 실행 방법이 다를 수 있으므로, 만약 하기와 같은 방법으로 SQLPlus 실행이 되지 않는다면, 사용하고 있는 docker 이미지명 sqlplus로 구글링해보길 추천합니다.

DataGrip을 통해 Oracle Database 접속하기

DataGrip은 JetBrain이 제공하는 Database 접근을 편리하게 할 수 있는 도구입니다. 대학교 계정이 있다면 무료로 사용할 수 있으므로, 학생이시면 다운받아 사용하는 것을 추천합니다.

DataGrip 세팅을 하기 전, Oracle Database 컨테이너가 실행중이어야 하므로 만약 컨테이너를 내린 상태라면 다시 실행한 후에 아래 과정을 수행하시길 바랍니다.

먼저 DataGrip에 접속하여 Database Explorer의 + 버튼을 누른 후 Data Source의 Oracle을 눌러줍니다. Data Source 설정은 하기 내용을 참고하시면 됩니다.

  • 처음 Oracle Data Source 설정을 하면 아래와 같이 driver files이 제대로 존재하지 않을 수 있습니다. 그 경우, Download 버튼을 클릭하여 필요한 driver 파일들을 다운받은 후 Test Connection을 진행하시면 됩니다.

DataGrip을 통해 Oracle Database 접근하기

Data Source 설정은 하기 표를 참고하여 설정하시면 됩니다.

항목 설명
Name Database Explorer에서 볼 Data Source 이름을 의미하므로, 원하는 값을 넣을 수 있음  
Host 로컬에 Database를 띄운 것이기 때문에 localhost를 작성 localhost
Port Oracle Database 컨테이너의 호스트OS 포트 필자의 경우, 51521로 설정하여서 51521로 넣음  
SID XE XE
User system  
Password oracle oracle

Test Connection까지 완료되면, OK 버튼을 클릭하여 생성한 Oracle Database의 콘솔에 아래와 같이 쿼리를 날려볼 수 있습니다. 기존에 SQLPlus에 날렸던 쿼리와 동일한 쿼리를 날린 것으로 동일한 결과가 나오는 것을 확인할 수 있습니다.

SQLPlus와 동일하게 결과가 나오는 것을 확인할 수 있습니다.

SQLPlus를 통해 SCOTT 계정 설정하기

SCOTT 계정이란, Oracle Database에 미리 생성되어 있는 학습용 계정입니다. SCOTT 계정에는 기본 학습을 위한 테이블과 데이터가 미리 구현되어 있습니다. 처음 Oracle Database을 설치하면 SCOTT 계정이 잠겨 있기 때문에 사용 가능 상태로 전환해주어야 합니다.

  • SQL 수행의 경우, DataGrip을 통해서도 가능합니다.

SQLPlus를 실행한 후, 하기와 같이 SQL을 수행하면 SCOTT 계정을 되살릴 수 있습니다.

ALTER USER SCOTT    -- SCOTT 계정을 변경하겠다는 의미
IDENTIFIED BY tiger -- 접속 비밀번호를 소문자 tiger로 지정한다는 의미
ACCOUNT UNLOCK;     -- 계정을 사용 가능한 상태로 전환한다는 의미

사용한 도커 이미지에는 SCOTT 계정이 존재하지 않음

다만, Oracle Database 11gR2 실행을 위해 사용한 docker 이미지에는 SCOTT 계정이 존재하지 않아 위 방법으로 SCOTT 계정 설정이 불가했습니다. 따라서 하기 과정을 통해 SCOTT 계정을 직접 생성해보겠습니다.

DataGrip과 SQLPlus를 통해 SCOTT 계정 생성하기

필자가 사용한 도커 이미지의 경우, SCOTT 계정이 존재하지 않아 참고 자료에 넣은 사이트 내용을 바탕으로 SCOTT 계정을 생성해보도록 하겠습니다. 먼저, DataGrip에서 query를 수행할 수 있는 query console을 띄워 하기와 같이 SCOTT 계정을 생성합니다.

CREATE USER scott identified by tiger; -- SCOTT 계정 생성(비밀번호는 tiger로 설정)
GRANT CONNECT, resource, dba TO scott; -- SCOTT 계정에 모든 권한 부여

위 쿼리를 통해 SCOTT 계정 생성 및 권한 부여가 완료되면 SELECT * FROM DBA_USERS로 조회하여 SCOTT 계정이 존재함을 확인할 수 있습니다.

SCOTT 계정 생성 및 권한 부여

이제 기본 학습을 위한 테이블과 데이터를 SCOTT 계정에 넣어보도록 하겠습니다. demobld.sql 파일을 이용하여 테이블 및 데이터를 생성할 것입니다. demobld.sql 파일은 하기 참고 자료에서 다운받을 수 있으며, 아래 코드를 복사하여 사용하셔도 무방합니다.

--
-- Copyright (c) Oracle Corporation 1988, 1999.  All Rights Reserved.
--
--  NAME
--    demobld.sql
--
-- DESCRIPTION
--   This script creates the SQL*Plus demonstration tables in the
--   current schema.  It should be STARTed by each user wishing to
--   access the tables.  To remove the tables use the demodrop.sql
--   script.
--
--  USAGE
--       SQL> START demobld.sql
--
--

SET TERMOUT ON
PROMPT Building demonstration tables.  Please wait.
SET TERMOUT OFF

CREATE TABLE BONUS
        (ENAME VARCHAR2(10),
         JOB   VARCHAR2(9),
         SAL   NUMBER,
         COMM  NUMBER);

CREATE TABLE EMP
       (EMPNO NUMBER(4) NOT NULL,
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MGR NUMBER(4),
        HIREDATE DATE,
        SAL NUMBER(7, 2),
        COMM NUMBER(7, 2),
        DEPTNO NUMBER(2));

INSERT INTO EMP VALUES
        (7369, 'SMITH',  'CLERK',     7902,
        TO_DATE('17-DEC-1980', 'DD-MON-YYYY'),  800, NULL, 20);
INSERT INTO EMP VALUES
        (7499, 'ALLEN',  'SALESMAN',  7698,
        TO_DATE('20-FEB-1981', 'DD-MON-YYYY'), 1600,  300, 30);
INSERT INTO EMP VALUES
        (7521, 'WARD',   'SALESMAN',  7698,
        TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1250,  500, 30);
INSERT INTO EMP VALUES
        (7566, 'JONES',  'MANAGER',   7839,
        TO_DATE('2-APR-1981', 'DD-MON-YYYY'),  2975, NULL, 20);
INSERT INTO EMP VALUES
        (7654, 'MARTIN', 'SALESMAN',  7698,
        TO_DATE('28-SEP-1981', 'DD-MON-YYYY'), 1250, 1400, 30);
INSERT INTO EMP VALUES
        (7698, 'BLAKE',  'MANAGER',   7839,
        TO_DATE('1-MAY-1981', 'DD-MON-YYYY'),  2850, NULL, 30);
INSERT INTO EMP VALUES
        (7782, 'CLARK',  'MANAGER',   7839,
        TO_DATE('9-JUN-1981', 'DD-MON-YYYY'),  2450, NULL, 10);
INSERT INTO EMP VALUES
        (7788, 'SCOTT',  'ANALYST',   7566,
        TO_DATE('09-DEC-1982', 'DD-MON-YYYY'), 3000, NULL, 20);
INSERT INTO EMP VALUES
        (7839, 'KING',   'PRESIDENT', NULL,
        TO_DATE('17-NOV-1981', 'DD-MON-YYYY'), 5000, NULL, 10);
INSERT INTO EMP VALUES
        (7844, 'TURNER', 'SALESMAN',  7698,
        TO_DATE('8-SEP-1981', 'DD-MON-YYYY'),  1500, NULL, 30);
INSERT INTO EMP VALUES
        (7876, 'ADAMS',  'CLERK',     7788,
        TO_DATE('12-JAN-1983', 'DD-MON-YYYY'), 1100, NULL, 20);
INSERT INTO EMP VALUES
        (7900, 'JAMES',  'CLERK',     7698,
        TO_DATE('3-DEC-1981', 'DD-MON-YYYY'),   950, NULL, 30);
INSERT INTO EMP VALUES
        (7902, 'FORD',   'ANALYST',   7566,
        TO_DATE('3-DEC-1981', 'DD-MON-YYYY'),  3000, NULL, 20);
INSERT INTO EMP VALUES
        (7934, 'MILLER', 'CLERK',     7782,
        TO_DATE('23-JAN-1982', 'DD-MON-YYYY'), 1300, NULL, 10);

CREATE TABLE DEPT
       (DEPTNO NUMBER(2),
        DNAME VARCHAR2(14),
        LOC VARCHAR2(13) );

INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH',   'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

CREATE TABLE SALGRADE
        (GRADE NUMBER,
         LOSAL NUMBER,
         HISAL NUMBER);

INSERT INTO SALGRADE VALUES (1,  700, 1200);
INSERT INTO SALGRADE VALUES (2, 1201, 1400);
INSERT INTO SALGRADE VALUES (3, 1401, 2000);
INSERT INTO SALGRADE VALUES (4, 2001, 3000);
INSERT INTO SALGRADE VALUES (5, 3001, 9999);

COMMIT;

SET TERMOUT ON
PROMPT Demonstration table build is complete.

먼저 위 스크립트를 컨테이너 환경에 넣고, 실행시키기 위해서는 vim이 필요합니다. 컨테이너를 생성할 때 따로 vim을 설치하지 않았다면 아래와 같이 컨테이너 환경에 접속(docker exec -it [컨테이너명] bash)했을 때 vim을 사용할 수 없습니다.

vim: command not found

이때에는 아래와 같은 명령어를 통해 apt-get을 업데이트하고, vim을 설치해주어야 합니다.

apt-get update
apt-get install vim

vim 설치하기

위처럼 vim 설치가 완료되면, vim demobld.sql를 실행하여 위 스크립트를 복사하여 넣어주고 저장합니다.

demobld.sql 스크립트 저장이 완료되면, 도커 컨테이너 내에서 sqlplus scott/tiger 명령어를 입력하여 SCOTT 계정으로 SQLPlus를 실행합니다.

  • 만약, 기존에 SQLPlus를 다른 계정으로 실행 중이었다면 SQLPlus 실행 상태에서 CONN scott/tiger 명령어를 통해 SCOTT 계정으로 재접속이 가능합니다.
  • SCOTT 계정에 대해 테이블 및 데이터를 생성하는 것이므로, 이전과 다르게 SQLPlus 접근 시 SCOTT 계정을 사용합니다.

SCOTT 계정으로 SQLPlus를 실행한 후에는 앞서 넣어둔 demobld.sql를 실행시키기 위해 START demobld.sql 명령어를 수행하면 됩니다.

SCOTT 계정에 대해 demobld.sql 수행 및 그 결과 생성된 테이블 및 데이터 확인

그 결과, 위와 같이 SCOTT 계정으로 생성된 테이블들이 존재하고 해당 테이블에 데이터가 들어있음을 확인할 수 있습니다.

  • DESC 명령어는 describe의 줄임말로 특정 테이블이 어떤 열로 구성되어 있는지 확인하는 데 사용됩니다.

TIP: Docker 명령어

# 버전 확인
$ docker -v

# 이미지 다운로드
$ docker pull [이미지 명]

# 다운로드된 이미지 목록
$ docker images

# 컨테이너 생성
$ docker create [옵션] [이미지 명]

# 컨테이너 생성 및 실행
$ docker run [옵션] [이미지 명]

# 컨테이너 실행
$ docker start [컨테이너명]

# 컨테이너 재실행
$ docker restart [컨테이너명]

# 컨테이너 접속
$ docker attach [컨테이너명]

# 컨테이너 정지
$ docker stop [컨테이너명]

# 실행중인 컨테이너 목록
$ docker ps

# 정지된 컨테이너 목록
$ docker ps -a

# 컨테이너 명 변경
$ docker rename [기존 컨테이너명] [새로운 컨테이너명]

# 컨테이너 삭제
$ docker rm [컨테이너명]

참고 자료

728x90
반응형