CDB 및 PDB
다중 테넌트 아키텍처를 사용하면 Oracle 데이터베이스가 다중 테넌트 컨테이너 데이터베이스(CDB)로 작동할 수 있습니다.
Oracle Database 21c부터는 다중 테넌트 컨테이너 데이터베이스가 유일하게 지원되는 아키텍처입니다. 이전 릴리스에서는 Oracle이 비CDB(비컨테이너 데이터베이스)를 지원했습니다.
-
CDB의 컨테이너 정보 컨테이너는 다중 테넌트 CDB(컨테이너 데이터베이스)의 스키마, 객체 및 관련 구조 모음입니다. CDB 내에서 각 컨테이너는 고유한 ID와 이름을 가집니다.
-
CDB 루트 및 시스템 컨테이너 CDB 루트는 단순히 루트라고도 하며, 모든 PDB가 속한 스키마, 스키마 객체 및 비스키마 객체의 모음입니다.
-
PDB PDB는 클라이언트 응용 프로그램에 논리적으로 별도의 데이터베이스로 나타나는 스키마, 객체 및 관련 구조의 사용자 생성 집합입니다.
CDB의 컨테이너 정보
컨테이너는 다중 테넌트 CDB(컨테이너 데이터베이스)에 있는 스키마, 객체 및 관련 구조의 모음입니다. CDB 내에서 각 컨테이너는 고유한 ID와 이름을 가집니다.
CDB에는 고객이 생성한 PDB(플러거블 데이터베이스) 및 애플리케이션 컨테이너가 0개, 1개 또는 여러 개 포함됩니다. PDB는 Oracle Net 클라이언트에 별도의 데이터베이스로 나타나는 스키마, 스키마 객체 및 비스키마 객체의 이식 가능한 모음입니다. 애플리케이션 컨테이너는 하나 이상의 애플리케이션 백엔드에 대한 데이터 및 메타데이터를 저장하는 선택적 사용자 생성 CDB 구성요소입니다. CDB에는 0개 이상의 애플리케이션 컨테이너가 포함됩니다.
주: 애플리케이션 컨테이너에 대한 자세한 내용은 "애플리케이션 컨테이너"를 참조하십시오.
다음 그림은 CDB에서 가능한 컨테이너를 나타냅니다.
그림 1: CDB의 컨테이너

모든 CDB에는 다음과 같은 컨테이너가 있습니다.
-
정확히 하나의 CDB 루트 컨테이너(단순히 루트라고도 함)
CDB 루트는 모든 PDB가 속한 스키마, 스키마 객체 및 비스키마 객체의 모음입니다("CDB 및 PDB 참조). 루트는 Oracle에서 제공하는 메타 데이터 및 일반 유저를 저장합니다. 메타 데이터의 예로는 Oracle 제공 PL/SQL 패키지의 소스 코드가 있습니다. 공통 사용자는 모든 컨테이너에서 알려진 데이터베이스 사용자입니다("일반 사용자 계정 참조). 루트 컨테이너의 이름은
CDB$ROOT입니다. -
정확히 하나의 시스템 컨테이너
시스템 컨테이너에는 루트 CDB 및 CDB의 모든 PDB가 포함됩니다. 따라서 시스템 컨테이너는 CDB 자체의 논리적 컨테이너입니다.
-
0개 이상의 애플리케이션 컨테이너
응용 프로그램 컨테이너는 정확히 하나의 응용 프로그램 루트와 이 루트에 플러그인된 PDB로 구성됩니다. 시스템 컨테이너가 CDB 루트를 포함하고 CDB 내에 있는 PDB를 모두 포함하는 반면, 애플리케이션 컨테이너에는 애플리케이션 루트에 플러그인된 PDB만 포함됩니다. 응용 프로그램 루트는 CDB 루트에 속하며 다른 컨테이너는 속하지 않습니다.
-
0개 이상의 사용자 생성 PDB
PDB에는 특정 기능 집합에 필요한 데이터와 코드가 포함되어 있습니다("PDB 참조). 예를 들어, PDB는 인적 자원이나 영업 애플리케이션과 같은 특정 애플리케이션을 지원할 수 있습니다. CDB 생성 시 PDB가 존재하지 않습니다. 업무 요구 사항에 따라 PDB를 추가합니다.
PDB는 정확히 0개 또는 하나의 애플리케이션 컨테이너에 속합니다. PDB가 애플리케이션 컨테이너에 속하는 경우 애플리케이션 PDB입니다. 예를 들어,
cust1_pdb및cust2_pdb애플리케이션 PDB는saas_sales_ac애플리케이션 컨테이너에 속할 수 있으며, 이 경우 다른 애플리케이션 컨테이너에 속하지 않습니다. 애플리케이션 시드는 사용자가 생성한 PDB 템플리트로 작동하여 새 애플리케이션 PDB를 빠르게 생성할 수 있는 선택적 애플리케이션 PDB입니다. -
정확히 하나의 시드 PDB
시드 PDB는 CDB가 새 PDB를 생성하는 데 사용할 수 있는 시스템 제공 템플리트입니다. 시드 PDB의 이름은
PDB$SEED입니다.PDB$SEED에서 객체를 추가하거나 수정할 수 없습니다.
애플리케이션 컨테이너가 없는 CDB 예 2-1
이 예에서는 시스템 컨테이너(전체 CDB), CDB 루트, PDB 시드(PDB$SEED) 및 PDB 2개 컨테이너가 있는 간단한 CDB를 보여줍니다. 각 PDB에는 고유한 전용 애플리케이션이 있습니다. 서로 다른 PDB 관리자가 각 PDB를 관리합니다. 공통 사용자는 단일 ID를 가진 CDB에 존재합니다. 이 예에서 공통 사용자 SYS는 루트 및 모든 PDB를 관리할 수 있습니다. 물리적 레벨에서 이 CDB는 하나 이상의 데이터베이스 Instance에서 관리되며, 각 PDB 및 CDB 자체에 대한 데이터 파일 집합을 포함합니다.
그림 2: 애플리케이션 컨테이너가 없는 CDB

애플리케이션 컨테이너가 있는 예제 2-2 CDB
이 변형에서 CDB는 saas_sales_ac이라는 응용 프로그램 컨테이너를 포함합니다. 애플리케이션 컨테이너 내에서 PDB cust1_pdb 애플리케이션은 한 고객에 대한 애플리케이션을 지원하며, PDB cust2_pdb 애플리케이션은 다른 고객에 대한 애플리케이션을 지원합니다. CDB에는 HR 응용 프로그램을 지원하지만 응용 프로그램 컨테이너에 속하지 않는 hrpdb라는 PDB도 포함되어 있습니다.
그림 3: 애플리케이션 컨테이너가 있는 CDB

이 예제에서는 여러 DBA가 CDB 환경을 관리합니다.
-
CDB 관리자는 CDB 자체를 관리합니다.
-
애플리케이션 컨테이너 관리자는 애플리케이션 설치 및 업그레이드를 포함하여
saas_sales_ac컨테이너를 관리합니다. -
애플리케이션 PDB 관리자는
saas_sales_ac컨테이너에서cust1_pdb및cust2_pdb의 두 PDB를 관리합니다. -
PDB 관리자는
hrpdb를 관리합니다.
CDB 루트 및 시스템 컨테이너
CDB 루트는 단순히 루트라고도 하며, 모든 PDB가 속한 스키마, 스키마 객체 및 비스키마 객체의 모음입니다.
모든 CDB에는 CDB$ROOT이라는 하나의 루트 컨테이너만 있습니다. 루트는 PDB 관리에 필요한 시스템 메타데이터를 저장합니다. 모든 PDB가 루트에 속합니다. 시스템 컨테이너는 CDB 루트이며 이 루트에 속하는 모든 PDB입니다.
CDB 루트는 사용자 데이터를 저장하지 않습니다. Oracle은 루트에 공통 객체를 추가하거나 루트에서 Oracle 제공 스키마를 수정하지 않을 것을 권장합니다. 그러나 데이터베이스 관리를 위한 일반 유저 및 롤은 생성할 수 있습니다. 필요한 권한을 가진 일반 사용자는 컨테이너 간에 전환할 수 있습니다.
Oracle은 루트 문자 집합에 AL32UTF8를 권장합니다. Character Set이 다른 PDB는 Character Set 변환 없이도 동일한 CDB에 상주할 수 있습니다.
예제 2-3 CDB의 모든 컨테이너
CDB 루트에 연결된 관리 사용자가 실행한 다음 질의는 CDB의 모든 컨테이너(시드 및 CDB 루트 포함)를 CON_ID 순서로 나열합니다.
COL NAME FORMAT A15
SELECT NAME, CON_ID, DBID, CON_UID, GUID
FROM V$CONTAINERS ORDER BY CON_ID;
NAME CON_ID DBID CON_UID GUID
------------- ------ ---------- ---------- --------------------------------
CDB$ROOT 1 1895287725 1 2003321EDD4F60D6E0534E40E40A41C5
PDB$SEED 2 2795386505 2795386505 200AC90679F07B55E05396C0E40A23FE
SAAS_SALES_AC 3 1239646423 1239646423 200B4CE0A8DC1D24E05396C0E40AF8EE
SALESPDB 4 3692549634 3692549634 200B4928319C1BCCE05396C0E40A2432
HRPDB 5 3784483090 3784483090 200B4928319D1BCCE05396C0E40A2432
참조: "공통 사용자 계정"
PDB
PDB는 클라이언트 응용 프로그램에 논리적으로 별도의 데이터베이스로 나타나는 스키마, 객체 및 관련 구조의 사용자 생성 집합입니다.
모든 PDB는 PDB를 생성한 사용자에 관계없이 SYS가 소유합니다. SYS는 CDB의 공통 사용자입니다. 즉, 루트 및 CDB 내의 모든 기존 및 미래 PDB에 동일한 ID를 가진 이 사용자입니다.
-
PDB 유형 모든 PDB는 Oracle에서 제공하는
PDB$SEED를 제외하고CREATE PLUGGABLE DATABASE문을 사용하여 사용자가 생성됩니다. -
PDB의 목적 애플리케이션의 경우 PDB는 완전한 기능을 갖춘 자체 포함된 Oracle 데이터베이스입니다. PDB를 단일 CDB로 통합하여 규모의 경제를 달성하는 동시에 PDB 간의 격리를 유지할 수 있습니다.
-
프록시 PDB 프록시 PDB는 참조된 PDB라는 원격 PDB를 가리킵니다.
-
Names for PDBs CDB의 컨테이너는 동일한 네임스페이스를 공유하므로 이 네임스페이스 내에서 고유한 이름을 가져야 합니다.
-
PDB 간 데이터베이스 링크 기본적으로 한 PDB에 접속된 사용자는 데이터베이스 링크를 사용하여 다른 PDB의 객체에 액세스해야 합니다.
PDB 유형
모든 PDB는 Oracle이 제공하는 PDB$SEED를 제외하고 CREATE PLUGGABLE DATABASE 문을 사용하여 생성됩니다.
다음 유형의 PDB를 생성할 수 있습니다.
표준 PDB
이 유형의 PDB는 PDB를 시드, 프록시 PDB 또는 애플리케이션 루트로 지정하지 않고 CREATE PLUGGABLE DATABASE를 실행하면 됩니다. 해당 기능은 사용자가 생성하는 컨테이너에 따라 달라집니다.
-
CDB 루트에 플러그인된 PDB
이 PDB는 애플리케이션 컨테이너가 아닌 CDB 루트 컨테이너에 속합니다. 이 유형의 PDB는 애플리케이션 공통 객체를 사용할 수 없습니다. "응용 프로그램 공통 객체"를 참조하십시오.
-
애플리케이션 PDB
애플리케이션 PDB는 정확히 하나의 애플리케이션 컨테이너에 속합니다. CDB 루트에 플러그인된 PDB와 달리 애플리케이션 PDB는 애플리케이션 컨테이너 내에서 마스터 애플리케이션 정의를 공유할 수 있습니다. 예를 들어, 응용 프로그램 루트의
usa_zipcodes테이블은 데이터 연결 공통 객체일 수 있습니다. 즉, 이 루트에 플러그인된 모든 응용 프로그램 PDB에서 액세스할 수 있는 데이터가 포함됩니다. 애플리케이션 컨테이너 내에 상주하지 않는 PDB는 애플리케이션 공통 객체에 액세스할 수 없습니다.
애플리케이션 루트
응용 프로그램 루트를 응용 프로그램 특정 루트 컨테이너로 간주합니다. 공통 데이터 및 메타데이터를 포함하여 애플리케이션 백엔드의 마스터 정의를 위한 저장소 역할을 합니다. 응용 프로그램 루트를 생성하려면 CDB 루트에 연결하고 CREATE PLUGGABLE DATABASE 문에 AS APPLICATION CONTAINER 절을 지정합니다. "Application Root"를 참조하십시오.
PDB 시드
표준 PDB와 달리 시드 PDB는 애플리케이션을 지원하지 않습니다. 대신 시드는 응용 프로그램을 지원하는 PDB 생성을 위한 템플리트입니다. 시드는 다음 중 하나일 수 있습니다.
-
CDB 루트에 플러그인된 시드 PDB(
PDB$SEED)이 시스템 제공 템플리트를 사용하여 애플리케이션 컨테이너 또는 시스템 컨테이너에 새 PDB를 생성할 수 있습니다. 시스템 컨테이너는 정확히 하나의 PDB 시드를 포함합니다.
PDB$SEED를 삭제하거나 객체를 추가하거나 그 안에 있는 객체를 수정할 수 없습니다. -
애플리케이션 시드 PDB
애플리케이션 컨테이너 내에서 애플리케이션 PDB 생성을 가속화하기 위해 선택적 애플리케이션 시드를 생성할 수 있습니다. 애플리케이션 컨테이너는 0개 또는 하나의 애플리케이션 시드를 포함합니다.
애플리케이션 컨테이너에 접속하고
CREATE PLUGGABLE DATABASE ... AS SEED문을 실행하여 애플리케이션 시드를 생성합니다. "응용 프로그램 시드"를 참조하십시오.
프록시 P DB
프록시 PDB는 데이터베이스 링크를 사용하여 원격 CDB의 PDB를 참조하는 PDB입니다. PDB가 열려 있는 동안 프록시 PDB에서 명령문을 실행하면 참조된 PDB에서 명령문이 실행됩니다.
CDB 루트 또는 애플리케이션 루트에 연결된 동안 프록시 PDB를 생성해야 합니다. 표준 PDB와 마찬가지로 프록시 PDB를 변경하거나 삭제할 수 있습니다.
PDB의 목적
응용 프로그램의 경우 PDB는 완전한 기능을 갖춘 자체 포함된 Oracle 데이터베이스입니다. PDB를 단일 CDB로 통합하여 규모의 경제를 달성하는 동시에 PDB 간의 격리를 유지할 수 있습니다.
PDB를 사용하여 다음과 같은 특정 목표를 달성할 수 있습니다.
-
애플리케이션별 데이터 저장
예를 들어, 영업 애플리케이션은 자체 전용 PDB를 가질 수 있고 HR 애플리케이션은 자체 전용 PDB를 가질 수 있습니다. 또는 이름이 지정된 PDB 모음인 애플리케이션 컨테이너를 생성하여 공통 데이터 및 메타데이터를 포함하는 애플리케이션 백엔드를 저장할 수 있습니다.
-
다른 CDB로 데이터 이동
데이터베이스는 자체 포함 단위(언플러그된 PDB라고 함)로 패키지화한 다음 다른 CDB로 이동할 수 있으므로 "플러그 가능한" 데이터베이스입니다.
-
신속한 업그레이드 수행
하위 Oracle 데이터베이스 릴리스의 CDB에서 PDB를 언플러그한 다음 상위 릴리스의 CDB에 플러그인할 수 있습니다.
-
가용성 손실 없이 신속하게 데이터 복사
테스트 및 개발을 위해 PDB가 열려 있는 동안 복제본을 동일하거나 다른 CDB에 저장하여 복제본을 복제할 수 있습니다. 선택적으로 PDB를 새로고침 가능한 복제 PDB로 지정할 수 있습니다. 또는 Oracle에서 제공한 시드 PDB 또는 사용자가 생성한 애플리케이션 시드를 사용하여 새 PDB를 복사합니다.
-
다른 CDB의 참조 데이터
동일한 CDB 또는 별도의 CDB에서 다른 PDB를 참조하는 프록시 PDB를 생성할 수 있습니다. 프록시 PDB에서 명령문을 실행하면 참조된 PDB에서 실행됩니다.
-
PDB 내에서 권한 부여 분리
적절한 권한을 가진 로컬 또는 일반 사용자는 개별 PDB 내의
PUBLIC에 스키마 객체에 대한EXECUTE권한을 부여할 수 있습니다.
참조:
-
Oracle AI Database Security Guide - CDB에서 롤 및 권한을 부여하는 방법 학습
프록시 P DB
프록시 PDB는 참조된 PDB라고 하는 원격 PDB를 나타냅니다.
프록시(참조) PDB에서 SQL 문을 실행하지만 참조된 PDB에서 명령문이 실행됩니다. 이러한 측면에서 프록시 PDB는 Linux의 심볼릭 링크 파일과 느슨하게 유사합니다.
프록시 PDB는 다음과 같은 이점을 제공합니다.
-
여러 애플리케이션 모델에서 데이터 집계
프록시 PDB를 사용하면 여러 소스의 데이터를 집계할 수 있는 위치 투명 응용 프로그램을 작성할 수 있습니다. 이러한 소스는 동일한 데이터 센터에 있거나 데이터 센터에 분산될 수 있습니다.
-
한 CDB에서 응용 프로그램 루트를 사용으로 설정하여 응용 프로그램 변경 사항을 다른 응용 프로그램 루트로 전달합니다.
CDB
cdb_prod및cdb_test에 동일한 응용 프로그램 모델이 있다고 가정합니다.cdb_prod의 애플리케이션 컨테이너에서cdb_test의 애플리케이션 루트를 참조하는 프록시 PDB를 생성합니다.cdb_prod의 애플리케이션 루트에서 설치 및 업그레이드 스크립트를 실행하면 Oracle AI Database는 이러한 명령문을 프록시 PDB로 전달하고, 이 명령문은cdb_test의 애플리케이션 루트로 원격으로 전송합니다. 이렇게 하면cdb_test의 응용 프로그램 루트가cdb_prod의 응용 프로그램 루트의 복제본이 됩니다.
프록시 PDB를 생성하려면 AS PROXY FROM 절을 사용하여 CREATE PLUGGABLE DATABASE를 실행합니다. 여기서 FROM는 참조된 PDB 이름과 데이터베이스 링크를 지정합니다. 생성 명령문은 SYSTEM 및 SYSAUX 테이블스페이스에 속하는 데이터 파일만 복사합니다.
예제 2-4 프록시 PDB 생성
이 예에서는 로컬 운용 CDB의 컨테이너 saas_sales_ac에 연결합니다. sales_admin 공통 사용자는 sales_sync_pdb라는 프록시 PDB를 생성합니다. 이 애플리케이션 PDB는 cdb_dev_rem 데이터베이스 링크를 사용하여 액세스하는 원격 개발 CDB에서 saas_sales_test_ac라는 애플리케이션 루트를 참조합니다. 프로덕션 CDB의 saas_sales_ac에서 애플리케이션 업그레이드가 발생하면 업그레이드가 원격 개발 CDB의 애플리케이션 루트 saas_sales_test_ac로 자동으로 전파됩니다.
CONNECT sales_admin@saas_sales_ac
Password: ***********
CREATE PLUGGABLE DATABASE sales_sync_pdb AS PROXY FROM saas_sales_test_ac@cdb_dev_rem;
PDB 이름
CDB의 컨테이너는 동일한 네임스페이스를 공유하므로 이 네임스페이스 내에서 고유한 이름을 가져야 합니다.
다음 컨테이너의 이름은 동일한 CDB 내에서 충돌하지 않아야 합니다.
-
CDB 루트
-
CDB 루트에 플러그인된 PDB
-
애플리케이션 루트
-
애플리케이션 PDB
예를 들어, 동일한 CDB에 애플리케이션 컨테이너 saas_sales_ac 및 saas_sales_test_ac가 포함된 경우 cust1라는 두 애플리케이션 PDB가 두 컨테이너에 동시에 상주할 수 없습니다. 또한 네임스페이스 규칙은 CDB 루트에 cust1pdb이라는 PDB가 생성되고 애플리케이션 루트에 cust1pdb이라는 PDB가 생성되지 않도록 방지합니다.
PDB 및 애플리케이션 루트 컨테이너의 이름은 네트 서비스 이름과 동일한 규칙을 따라야 합니다. 또한 PDB 또는 응용 프로그램 루트에 고유 이름을 가진 서비스가 있기 때문에 컨테이너 이름은 서비스가 특정 리스너를 통해 표시되는 모든 CDB에서 고유해야 합니다. 사용자가 생성한 컨테이너 이름의 첫 문자는 영문자여야 하며, 나머지 문자는 영숫자 또는 밑줄(_)이어야 합니다. 서비스 이름은 대소문자를 구분하지 않으므로 컨테이너 이름은 대소문자를 구분하지 않으며 구분된 식별자를 사용하여 지정한 경우에도 대문자로 표시됩니다.
참조: 서비스 이름에 대한 규칙은 Oracle AI Database Net Services Reference
PDB 간 데이터베이스 링크
기본적으로 한 PDB에 연결된 유저는 데이터베이스 링크를 사용하여 다른 PDB의 객체에 액세스해야 합니다.
그림 4: PDB 간 데이터베이스 링크

규칙에 대한 예외는 다음과 같습니다.
-
데이터 연결 공통 객체 - 이 객체를 가리키는 데이터 링크가 포함된 모든 응용 프로그램 PDB에서 액세스할 수 있습니다. 예를 들어, 애플리케이션 컨테이너(
saas_sales_ac)는 해당 애플리케이션 내에 데이터 링크 테이블(usa_zipcodes)을 포함할 수 있다. 이 경우 공통 CDB 사용자c##dba는 이 컨테이너의 애플리케이션 PDB에 접속한 다음 실제 테이블이 애플리케이션 루트에 상주하더라도usa_zipcodes를 질의할 수 있습니다. 이 경우 데이터베이스 링크가 필요하지 않습니다. -
CDB 루트 또는 애플리케이션 루트에서 실행된 SQL의
CONTAINERS()절입니다. 이 절을 사용하면 컨테이너 루트에 플러그인된 모든 PDB에서 데이터를 질의할 수 있습니다.
프록시 PDB를 생성할 때는 CREATE PLUGGABLE DATABASE ... AS PROXY 문의 FROM 절에 데이터베이스 링크 이름을 지정해야 합니다. 프록시 PDB 및 참조된 PDB가 별도의 CDB에 상주하는 경우 프록시 PDB를 포함할 CDB의 루트에 데이터베이스 링크를 정의해야 합니다. 데이터베이스 링크는 원격 참조된 PDB 또는 원격 CDB의 CDB 루트에 연결해야 합니다.
참조: "공통 및 로컬 객체"