Oracle 19c Installation Using Docker on M1

Page content

개요

  • Docker 활용해서 Oracle 설치하기 on M1
  • SQL Developer 활용해서 접속 및 테스트하기

사전조건

  • Docker가 이미 설치가 되어 있다고 가정한다.

Oracle Database 설치 순서

Step 01 : 도커 이미지 가져오기

  • Clone Oracle’s Docker Images Repository, Open your terminal and run
git clone https://github.com/oracle/docker-images

Step 02 : Oracle Database 19c 파일 다운로드

Screenshot 2025-03-15 at 10.17.41 AM.png

Screenshot 2025-03-15 at 10.23.15 AM.png

Step 03 : 도커 이미지 빌드

  • Build the Docker Image, Navigate to the dockerfiles directory
    • 터미널로 경로 이동한다.
cd docker-images/OracleDatabase/SingleInstance/dockerfiles/
  • 스크립트 실행하기
    • This command builds the Oracle 19c Enterprise Edition Docker image.
./buildContainerImage.sh -v 19.3.0 -e

Screenshot 2025-03-15 at 10.27.34 AM.png

Screenshot 2025-03-15 at 10.33.06 AM.png

Step 04 : Oracle Docker 컨테이너 실행

  • Once the image is built, start a container
  • 코드 해석
    • -d : 컨테이너를 백그라운드에서 실행 (Detached mode)
    • --name oracledb2 : 컨테이너 이름을 oracledb2로 지정
    • -p 1521:1521 : 호스트의 1521번 포트를 컨테이너의 1521번 포트와 매핑 (Oracle 기본 포트)
    • -p 5500:5500 : 호스트의 5500번 포트를 컨테이너의 5500번 포트와 매핑 (Oracle Enterprise Manager 사용 시 필요)
    • 환경변수
      • -e ORACLE_SID=XE : CDB (Container Database) 이름을 XE로 설정
      • -e ORACLE_PDB=XE_PDB : PDB (Pluggable Database) 이름을 XE_PDB로 설정
      • -e ORACLE_PWD=Secret123 : 관리자 계정(SYS, SYSTEM)의 기본 비밀번호를 Secret123으로 설정
      • -e ORACLE_CHARACTERSET=AL32UTF8 : 데이터베이스 문자 인코딩을 AL32UTF8 (UTF-8)로 설정
    • oracle/database:19.3.0-ee : Oracle 19c Enterprise Edition (EE) Docker 이미지
$ docker container run -d --name oracledb2 \
>   -p 1521:1521 -p 5500:5500 \
>   -e ORACLE_SID=XE \
>   -e ORACLE_PDB=XE_PDB \
>   -e ORACLE_PWD=Secret123 \
>   -e ORACLE_CHARACTERSET=AL32UTF8 \
>   oracle/database:19.3.0-ee
537d13cc65676b098a784ba1386e864d359cb5e2722e1f0d3a5f369f345081f0
  • 실제 실행이 되는지 확인
    • 메시지에서 중간에 DATABASE IS READY TO USE! 있으면 성공적으로 컨테이너 설치가 완료된 상태
$ docker logs -f oracledb2
ORACLE EDITION: ENTERPRISE

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-MAR-2025 02:20:38
...(생략)...
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
ALTER SYSTEM SET control_files='/opt/oracle/oradata/ORCLCDB/control01.ctl' SCOPE=SPFILE;
2025-03-15T02:27:57.418659+00:00
ALTER SYSTEM SET local_listener='' SCOPE=BOTH;
   ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE
2025-03-15T02:27:57.851458+00:00
ORCLPDB1(3):Opening pdb with no Resource Manager plan active
ORCLPDB1(3):joxcsys_required_dirobj_exists: directory object exists with required path /opt/oracle/product/19c/dbhome_1/javavm/admin/, pid 2967 cid 3
Pluggable database ORCLPDB1 opened read write
Completed: alter pluggable database "ORCLPDB1" open
Completed:    ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE

Step 05 : 리스너 확인

  • 리스너가 정상적으로 실행되었는지 확인
    • 현재 리스너는 정상적으로 실행되고 있지만,데이터베이스 서비스가 RESTRICTED 상태로 등록되어 있다.
    • 이는 일반적인 사용자 접속이 제한된 상태 이며, SQL Developer 또는 SQL*Plus에서 정상적으로 연결되지 않을 가능성이 크다.
    • 일반적으로 READY 상태여야 정상 접속 가능
$ docker exec -it oracledb2 lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-MAR-2025 02:52:31

Copyright (c) 1991, 2023, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                15-MAR-2025 02:49:19
Uptime                    0 days 0 hr. 3 min. 12 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/537d13cc6567/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Services Summary...
Service "XE" has 1 instance(s).
  Instance "XE", status RESTRICTED, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "XE", status RESTRICTED, has 1 handler(s) for this service...
The command completed successfully
  • 아래와 같이 READY가 확인되면 계정 만들기
$ docker exec -it oracledb2 lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-MAR-2025 03:00:24

Copyright (c) 1991, 2023, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                15-MAR-2025 02:49:19
Uptime                    0 days 0 hr. 11 min. 4 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/537d13cc6567/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=537d13cc6567)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/XE/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "3059ba5e667c0bfae063020011ac84c7" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
Service "XE" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
Service "xe_pdb" has 1 instance(s).
  Instance "XE", status READY, has 1 handler(s) for this service...
The command completed successfully
You have new mail in /var/mail/evan

Step 06 : 계정생성

  • 컨테이너 접속
$ docker exec -it oracledb2 sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Mar 15 03:01:00 2025
Version 19.19.0.0.0

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

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0
  • PDB(Pluggable Database) 상태 확인
    • 만약 XE_PDBMOUNTED 상태라면, 반드시 OPEN 해야 함
SQL> SHOW PDBS;

CON_ID  CON_NAME   OPEN MODE  RESTRICTED
------  ---------  --------  ----------
2       PDB$SEED   READ ONLY  NO
3       XE_PDB     MOUNTED    NO
  • PDB로 전환 후 계정 생성
SQL> ALTER PLUGGABLE DATABASE XE_PDB OPEN;
SQL> ALTER SESSION SET CONTAINER=XE_PDB;
Session altered.
  • 새로운 계정 생성
    • 새로운 사용자 admin_user를 생성하고, 비밀번호를 AdminPass123으로 설정
    • 새로운 사용자에게 필수적인 권한을 부여
      • GRANT CONNECT : DB에 로그인 가능하도록 설정
      • GRANT RESOURCE : 테이블, 인덱스, 뷰 등을 생성할 수 있도록 권한 부여
      • GRANT DBA : 데이터베이스 관리자(DBA) 권한 부여 (모든 관리 기능 허용), 일반적으로 DBA 권한 부여하면 슈퍼 유저가 됨
    • 사용자가 데이터를 저장할 수 있도록 테이블스페이스 할당량을 무제한으로 설정
CREATE USER admin_user IDENTIFIED BY AdminPass123;
GRANT CONNECT, RESOURCE, DBA TO admin_user;
ALTER USER admin_user QUOTA UNLIMITED ON USERS; 

CDB와 PDB 차이점

  • CDB(Container Database)하나 이상의 PDB(플러그어블 데이터베이스)를 포함하는 컨테이너 역할을 한다.

    • CDB는 데이터베이스의 “껍데기”(Container) 역할을 하며, 여러 개의 PDB(Pluggable Database)를 포함할 수 있음.
    • CDB 자체는 사용자 데이터를 저장하지 않으며, 주로 데이터베이스 인스턴스 및 공통 시스템 데이터 관리 기능을 제공.
    • Oracle에서 시스템 수준의 관리를 수행하는 최상위 데이터베이스.
    • 구조 (예시)
    CDB (Container Database)
     ├── Root Container (CDB$ROOT)  -> 공통 시스템 데이터 저장
     ├── Seed PDB (PDB$SEED)        -> 새로운 PDB 생성 템플릿
     ├── PDB1 (User Database)       -> 실제 사용자 데이터 저장
     ├── PDB2 (User Database)       -> 다른 사용자 데이터 저장
    
  • PDB(Pluggable Database)CDB 내부에 존재하는 독립적인 데이터베이스이다.

    • PDB는 사용자 데이터 및 애플리케이션 데이터를 저장하는 실제 데이터베이스
    • 각각의 PDB는 개별적으로 백업, 복구, 클론(복제) 가능.
    • 여러 개의 PDB를 하나의 CDB 아래에서 실행할 수 있어, 리소스 관리가 효율적.
    • DBA는 CDB를 유지하면서 개별적인 PDB를 추가하거나 제거할 수 있음.
    • PDB의 특징
      • 독립적인 데이터베이스처럼 동작하지만, CDB의 리소스를 공유.
      • PDB 내부에서 사용자 계정, 테이블, 인덱스, 데이터 저장 가능.
      • 각각의 PDB는 자체적인 테이블스페이스를 가짐.

SQL Developer 통한 접속 테스트

  • SQL Developer 다운로드 페이지에서 다운로드 받기
    • Mac ARM64 with JDK 17 included 클릭해서 다운로드 받기
    • 압축파일 풀기

Screenshot 2025-03-15 at 10.43.37 AM.png

  • 실행하기

Screenshot 2025-03-15 at 10.46.16 AM.png

  • 접속하기

Screenshot 2025-03-15 at 12.08.33 PM.png

  • 테스트
CREATE TABLE employees (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    department VARCHAR2(50),
    salary NUMBER
);

INSERT INTO employees VALUES (1, 'Alice', 'HR', 60000);
INSERT INTO employees VALUES (2, 'Bob', 'IT', 75000);
INSERT INTO employees VALUES (3, 'Charlie', 'Finance', 80000);
COMMIT;


SELECT * FROM employees;

Screenshot 2025-03-15 at 12.10.26 PM.png