윈도우, 맥을 왔다갔다 많이 하다 보니 운영체제에 독립적으로 DB 셋업을 할 일이 있었습니다. Oracle 베이스인 SQLP를 공부하는 만큼 Oracle 실습을 진행하고자 하는데, 셋업 및 사용법을 정리해보았습니다.
도커 이미지는 여러가지가 있지만 오라클 공식 사이트에서 제공하는 것을 기준으로 작성하였습니다.
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!
#########################
docker exec oracle resetPassword 원하는암호
docker stop oracle
docker start oracle
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 계정을 가지고 접속유저를 생성할 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.
다음과 같은 예시 유저를 만들고 실습을 진행합니다.
- 유저명 :
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.
FREEPDB1)jdbc:oracle:thin:@localhost:1521/FREEPDB1## 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가 나와서 뭐지...? 생각하셨을 수도 있어서 첨부합니다.
아래는 오라클 컨테이너 데이터베이스의 기본 구조입니다. CDB(Container Database) 가 중앙으로 관리하고, PDB(Pluggable Database)를 여러 개 붙이는 형태입니다. 이를 오라클 멀티테넌트(Multitenant)라 합니다.
CDB (Container Database) - 컨테이너 데이터베이스
├── CDB$ROOT - 루트 컨테이너
├── PDB$SEED - 시드 PDB (템플릿)
├── PDB1 - 첫 번째 Pluggable Database
├── PDB2 - 두 번째 Pluggable Database
└── PDB3 - 세 번째 Pluggable Database
-- 현재 컨테이너 확인
SHOW CON_NAME;
-- 모든 PDB 목록 조회
SELECT name, open_mode FROM v$pdbs;
-- CDB인지 확인
SELECT cdb FROM v$database;
-- 특정 PDB로 세션 변경
ALTER SESSION SET CONTAINER = XEPDB1;
-- 루트 컨테이너로 이동
ALTER SESSION SET CONTAINER = CDB$ROOT;
-- 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;
-- 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
SQL> alter session set container=FREEPDB1;
Session altered.