[DB] Oracle Docker 환경 구성

주재완·2025년 8월 15일
0

Database

목록 보기
3/5
post-thumbnail

윈도우, 맥을 왔다갔다 많이 하다 보니 운영체제에 독립적으로 DB 셋업을 할 일이 있었습니다. Oracle 베이스인 SQLP를 공부하는 만큼 Oracle 실습을 진행하고자 하는데, 셋업 및 사용법을 정리해보았습니다.

Docker 환경 구성

도커 이미지는 여러가지가 있지만 오라클 공식 사이트에서 제공하는 것을 기준으로 작성하였습니다.

도커 이미지만 다운로드

docker pull container-registry.oracle.com/database/free:latest

도커로 이미지 다운받아 실행

docker run -d -p 1521:1521 --name oracle -e ORACLE_PASSWORD=oracle container-registry.oracle.com/database/free:latest
  • -d : detach, 컨테이너가 백그라운드에서 실행될 수 있게 합니다(데몬 모드).
  • -p : port, 각 포트를 설정합니다(오라클의 기본포트는 1521).
  • -e : 컨테이너 내에서 사용될 환경변수를 설정합니다.

도커 프로세스 눈으로 확인

docker ps -a

도커 프로세스 실행상태 로그 출력

docker logs -f oracle

아래 메세지가 나올 때 까지 기다립니다.

#########################
# DATABASE IS READY TO USE!
#########################

만약 sys나 system의 암호을 잊었다면

docker exec oracle resetPassword 원하는암호

중단

docker stop oracle

시작

docker start oracle

해당 컨테이너의 system 계정으로 접속

docker exec -it oracle /bin/bash

sqlplus / as sysdba
  • -i, --interactive=false : 표준 입력(stdin)을 활성화하며 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지한다.
  • -t, --tty=false : TTY 모드(pseudo-TTY)를 사용한다. Bash를 사용하려면 이 옵션을 설정해야 한다. 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셸이 표시되지 않는다.
  • sqlplus / as sysdba : 오라클 데이터베이스로 system 계정을 가지고 접속

접속 후 User 만들기

PDB에 접속

유저를 생성할 PDB에 접속합니다.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ WRITE NO

## PDB에 접속
SQL> alter session set container=FREEPDB1; 

Session altered.

User 생성

다음과 같은 예시 유저를 만들고 실습을 진행합니다.

  • 유저명 : docker
  • PW : docker123
## user 생성
SQL> create user docker identified by "docker123";

User created.

## 접속, resource 권한 부여
SQL> grant connect, resource to docker;

Grant succeeded.

## users 테이블스페이스 사용 권한 설정
SQL> alter user docker quota unlimited on users;

User altered.

Client Tool (DBeaver, Datagrip, …) 접속

  • driver : thin
  • SID 대신 서비스명 으로 접속할 것
  • 서비스명 : 처음 session 설정한 PDB(FREEPDB1)
  • jdbc:oracle:thin:@localhost:1521/FREEPDB1

SQL*Plus 접근 방법

  • 실습 하다보면 SQL*Plus로 터미널로 직접 접근 할 일이 생김
  • 방법 3가지 중 선택
## 1. Docker Oracle 컨테이너에서의 일반적인 접속
docker exec -it oracle sqlplus docker/docker123@FREEPDB1

## 2. exec 환경에서 PDB 지정하여 접속
## bash 는 /bin/bash 과 동일
docker exec -it oracle bash
sqlplus docker/docker123@FREEPDB1

## 3. exec 환경에서 관리자 접근 후 세션에서 PDB 변경 후 접속
docker exec -it oracle bash
sqlplus / as sysdba
ALTER SESSION SET CONTAINER = FREEPDB1;
CONNECT docker/docker123;

PDB?

중간에 PDB가 나와서 뭐지...? 생각하셨을 수도 있어서 첨부합니다.

아래는 오라클 컨테이너 데이터베이스의 기본 구조입니다. CDB(Container Database) 가 중앙으로 관리하고, PDB(Pluggable Database)를 여러 개 붙이는 형태입니다. 이를 오라클 멀티테넌트(Multitenant)라 합니다.

CDB (Container Database) - 컨테이너 데이터베이스
├── CDB$ROOT - 루트 컨테이너
├── PDB$SEED - 시드 PDB (템플릿)
├── PDB1 - 첫 번째 Pluggable Database
├── PDB2 - 두 번째 Pluggable Database
└── PDB3 - 세 번째 Pluggable Database

특징

  • 각 PDB는 논리적으로 완전히 분리
  • PDB를 다른 CDB로 쉽게 이동 가능, 마치 USB 처럼
  • 리소스 효율성 - 메모리, CPU 등 시스템 리소스 공유

주요 명령어

  • 현재 환경 확인
-- 현재 컨테이너 확인
SHOW CON_NAME;

-- 모든 PDB 목록 조회
SELECT name, open_mode FROM v$pdbs;

-- CDB인지 확인
SELECT cdb FROM v$database;
  • PDB 간 이동
-- 특정 PDB로 세션 변경
ALTER SESSION SET CONTAINER = XEPDB1;

-- 루트 컨테이너로 이동
ALTER SESSION SET CONTAINER = CDB$ROOT;
  • PDB 관리
-- PDB 열기
ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- PDB 닫기
ALTER PLUGGABLE DATABASE pdb1 CLOSE;

-- PDB 생성
CREATE PLUGGABLE DATABASE pdb_new FROM pdb$seed;

-- PDB 삭제
DROP PLUGGABLE DATABASE pdb_old INCLUDING DATAFILES;

접속 방법

## 1. Docker Oracle 컨테이너에서의 일반적인 접속
docker exec -it oracle sqlplus docker/docker123@FREEPDB1

## 2. DataGrip 연결
jdbc:oracle:thin:@localhost:1521/FREEPDB1

## 3. exec 환경에서 PDB 지정하여 접속
docker exec -it oracle bash
sqlplus docker/docker123@FREEPDB1

## 4. exec 환경에서 관리자 접근 후 세션에서 PDB 변경 후 접속
docker exec -it oracle bash
sqlplus / as sysdba
ALTER SESSION SET CONTAINER = FREEPDB1;
CONNECT docker/docker123;

PDB 환경 확인

-- 1. CDB 환경인지 확인
SELECT cdb FROM v$database;

-- 2. 현재 위치 확인
SHOW CON_NAME;

-- 3. 모든 PDB 조회
SELECT name, open_mode, restricted FROM v$pdbs;

-- 4. 서비스 이름 확인
SELECT name FROM v$services;
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ WRITE NO
  • PDB에 접속
SQL> alter session set container=FREEPDB1; 

Session altered.
profile
안녕하세요! 언제나 탐구하고 공부하는 개발자, 주재완입니다.

0개의 댓글