CDB 및 PDB

다중 테넌트 아키텍처를 사용하면 Oracle 데이터베이스가 다중 테넌트 컨테이너 데이터베이스(CDB)로 작동할 수 있습니다.

Oracle Database 21c부터는 다중 테넌트 컨테이너 데이터베이스가 유일하게 지원되는 아키텍처입니다. 이전 릴리스에서는 Oracle이 비CDB(비컨테이너 데이터베이스)를 지원했습니다.

CDB의 컨테이너 정보

컨테이너는 다중 테넌트 CDB(컨테이너 데이터베이스)에 있는 스키마, 객체 및 관련 구조의 모음입니다. CDB 내에서 각 컨테이너는 고유한 ID와 이름을 가집니다.

CDB에는 고객이 생성한 PDB(플러거블 데이터베이스) 및 애플리케이션 컨테이너가 0개, 1개 또는 여러 개 포함됩니다. PDB는 Oracle Net 클라이언트에 별도의 데이터베이스로 나타나는 스키마, 스키마 객체 및 비스키마 객체의 이식 가능한 모음입니다. 애플리케이션 컨테이너는 하나 이상의 애플리케이션 백엔드에 대한 데이터 및 메타데이터를 저장하는 선택적 사용자 생성 CDB 구성요소입니다. CDB에는 0개 이상의 애플리케이션 컨테이너가 포함됩니다.

주: 애플리케이션 컨테이너에 대한 자세한 내용은 "애플리케이션 컨테이너"를 참조하십시오.

다음 그림은 CDB에서 가능한 컨테이너를 나타냅니다.

그림 1: CDB의 컨테이너

그림 admin112.png에 대한 설명

모든 CDB에는 다음과 같은 컨테이너가 있습니다.

애플리케이션 컨테이너가 없는 CDB 예 2-1

이 예에서는 시스템 컨테이너(전체 CDB), CDB 루트, PDB 시드(PDB$SEED) 및 PDB 2개 컨테이너가 있는 간단한 CDB를 보여줍니다. 각 PDB에는 고유한 전용 애플리케이션이 있습니다. 서로 다른 PDB 관리자가 각 PDB를 관리합니다. 공통 사용자는 단일 ID를 가진 CDB에 존재합니다. 이 예에서 공통 사용자 SYS는 루트 및 모든 PDB를 관리할 수 있습니다. 물리적 레벨에서 이 CDB는 하나 이상의 데이터베이스 Instance에서 관리되며, 각 PDB 및 CDB 자체에 대한 데이터 파일 집합을 포함합니다.

그림 2: 애플리케이션 컨테이너가 없는 CDB

그림 cncpt345.png에 대한 설명

애플리케이션 컨테이너가 있는 예제 2-2 CDB

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

그림 3: 애플리케이션 컨테이너가 있는 CDB

그림 cncpt383.png에 대한 설명

이 예제에서는 여러 DBA가 CDB 환경을 관리합니다.

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

이 유형의 PDB는 PDB를 시드, 프록시 PDB 또는 애플리케이션 루트로 지정하지 않고 CREATE PLUGGABLE DATABASE를 실행하면 됩니다. 해당 기능은 사용자가 생성하는 컨테이너에 따라 달라집니다.

애플리케이션 루트

응용 프로그램 루트를 응용 프로그램 특정 루트 컨테이너로 간주합니다. 공통 데이터 및 메타데이터를 포함하여 애플리케이션 백엔드의 마스터 정의를 위한 저장소 역할을 합니다. 응용 프로그램 루트를 생성하려면 CDB 루트에 연결하고 CREATE PLUGGABLE DATABASE 문에 AS APPLICATION CONTAINER 절을 지정합니다. "Application Root"를 참조하십시오.

PDB 시드

표준 PDB와 달리 시드 PDB는 애플리케이션을 지원하지 않습니다. 대신 시드는 응용 프로그램을 지원하는 PDB 생성을 위한 템플리트입니다. 시드는 다음 중 하나일 수 있습니다.

프록시 P DB

프록시 PDB는 데이터베이스 링크를 사용하여 원격 CDB의 PDB를 참조하는 PDB입니다. PDB가 열려 있는 동안 프록시 PDB에서 명령문을 실행하면 참조된 PDB에서 명령문이 실행됩니다.

CDB 루트 또는 애플리케이션 루트에 연결된 동안 프록시 PDB를 생성해야 합니다. 표준 PDB와 마찬가지로 프록시 PDB를 변경하거나 삭제할 수 있습니다.

PDB의 목적

응용 프로그램의 경우 PDB는 완전한 기능을 갖춘 자체 포함된 Oracle 데이터베이스입니다. PDB를 단일 CDB로 통합하여 규모의 경제를 달성하는 동시에 PDB 간의 격리를 유지할 수 있습니다.

PDB를 사용하여 다음과 같은 특정 목표를 달성할 수 있습니다.

참조:

프록시 P DB

프록시 PDB는 참조된 PDB라고 하는 원격 PDB를 나타냅니다.

프록시(참조) PDB에서 SQL 문을 실행하지만 참조된 PDB에서 명령문이 실행됩니다. 이러한 측면에서 프록시 PDB는 Linux의 심볼릭 링크 파일과 느슨하게 유사합니다.

프록시 PDB는 다음과 같은 이점을 제공합니다.

프록시 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에 애플리케이션 컨테이너 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 간 데이터베이스 링크

그림 cncpt384.png에 대한 설명

규칙에 대한 예외는 다음과 같습니다.

프록시 PDB를 생성할 때는 CREATE PLUGGABLE DATABASE ... AS PROXY 문의 FROM 절에 데이터베이스 링크 이름을 지정해야 합니다. 프록시 PDB 및 참조된 PDB가 별도의 CDB에 상주하는 경우 프록시 PDB를 포함할 CDB의 루트에 데이터베이스 링크를 정의해야 합니다. 데이터베이스 링크는 원격 참조된 PDB 또는 원격 CDB의 CDB 루트에 연결해야 합니다.

참조: "공통 및 로컬 객체"