CDB와 PDB 구조
CDB 루트, 시드와 사용자 PDB의 역할, PDB별 데이터 파일과 CDB가 공유하는 리두 및 메모리
#핵심 요약
CDB 안에는 CDB 루트(CDB$ROOT), 시드 PDB(PDB$SEED), 사용자가 만든 PDB가 있음
PDB는 데이터 파일을 각자 따로 가짐
리두 로그 파일, 컨트롤 파일, SGA, 백그라운드 프로세스는 CDB 전체가 하나로 공유함
있어야 할 테이블이 안 보이면 지금 세션이 루트에 붙어 있는지부터 확인함SHOW CON_NAME이나 SYS_CONTEXT('USERENV', 'CON_NAME')로 봄
#개념과 동작 원리
#구성 요소
| 구성 요소 | 갖는 데이터 파일 | 역할 | 사용자 직접 접근 |
|---|---|---|---|
CDB 루트(CDB$ROOT) |
Oracle 제공 메타데이터와 공통 사용자 정보 | 모든 PDB가 함께 쓰는 정보의 기준점 | 보통 DBA만 |
시드 PDB(PDB$SEED) |
템플릿용 데이터 파일 | 새 PDB를 만들 때 복사하는 실습 | 거의 없음 |
| 사용자 PDB | 애플리케이션별 데이터 파일 | 실제 데이터와 코드를 담음 | 애플리케이션과 사용자 |
| 공유 기반(리두 로그, 컨트롤 파일, SGA, 백그라운드 프로세스) | 해당 없음(CDB 단위) | 모든 PDB가 공유 | 해당 없음 |
실습에서는 멀티테넌트의 목표 중 하나가 PDB 하나와 애플리케이션 하나를 1:1로 대응시키는 것이라고 적었음
실습에서는 UNDO 테이블스페이스도 공유 대상으로 적었음
이는 shared undo 모드일 때의 설명이고, local undo 모드에서는 PDB마다 UNDO 테이블스페이스를 가짐(로컬 UNDO와 임시 UNDO, 검토 기록)
공통 사용자는 모든 컨테이너에서 같은 계정으로 인식됨
이름 규칙과 생성은 공통 사용자와 로컬 사용자에 있음
#필수 명령어 또는 SQL
#지금 접속한 컨테이너 확인
SHOW CON_NAME
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM dual;
SHOW PDBS결과 해석:
실습 기록: 접속 직후는 CDB$ROOT였음SHOW PDBS에서 PDB$SEED는 READ ONLY, 사용자 PDB는 READ WRITE로 나왔음
#PDB마다 데이터 파일이 따로 있는지 확인
SELECT file_name FROM dba_data_files;ALTER SESSION SET CONTAINER = <PDB_NAME>;
SELECT file_name FROM dba_data_files;결과 해석:
설명: 루트에서는 루트 소유의 SYSTEM, SYSAUX, UNDO, USERS 데이터 파일만 보이고, PDB로 바꾸면 그 PDB의 하위 디렉터리 파일만 보임DBA_ 뷰는 현재 컨테이너 기준으로 보여 줌
SELECT con_id, file_name FROM cdb_data_files ORDER BY con_id;결과 해석:
실습 확인 문제: 루트에서 CDB_ 뷰를 쓰면 컨테이너를 바꾸지 않고 모든 컨테이너의 데이터 파일을 CON_ID와 함께 봄
실습 기록에는 CON_ID 1(루트)과 사용자 PDB들이 나왔고 2(시드)는 없었음CDB_ 뷰가 시드를 기본으로 숨긴다는 설명은 TEMP 테이블스페이스에 있음
#운영체제에서 공유 파일 위치 확인
ls <DATAFILE_DIR>결과 해석:
설명: CDB 데이터 파일 디렉터리에는 컨트롤 파일과 리두 로그 파일, 루트 데이터 파일, PDB별 하위 디렉터리가 있음
컨트롤 파일과 리두 로그는 PDB 하위 디렉터리에는 없음
실습에서는 이것으로 "리두 로그와 컨트롤 파일은 CDB 전체가 공유한다"를 운영체제에서도 확인했음
디렉터리 배치는 설치 방식(OMF 여부)에 따라 다름
#사용 조건과 주의사항
Multitenant 구조의 공식 문서 대조 여부는 확인 불가
실습 확인 문제의 SQL*Plus 프롬프트 설정(glogin.sql)과 tnsnames.ora 별칭 추가는 접속과 도구 분야 범위라 여기서 다루지 않음