클라우드 데이터베이스 Oracle 12c 가이드 (2016년)
컨테이너 데이터베이스(CDB) 0 1 19,186

by 구루비스터디 오라클 멀티테넌트 [2023.09.05]


컨테이너 데이터베이스(CDB)

  • CDB는 멀티테넌트 아키텍처 내의 부모나 root와 유사하다.
  • 개요
구분내용
1CDB 생성
2CDB 구조
3CDB 명명
4CDB 장점
5CDB 생성에 필요한 버전
6CDB 루트 컨테이너
7CDB common 유저


멀티테넌트 컨테이너 데이터베이스 생성
  • 오라클 데이터베이스 12c에서 디폴트로 CDB가 생성되지 않는다.
  • create database절에 enable pluggable database 추가
  • DBCA 사용 시 CDB 옵션 선택
  • CDB, non-CDB 설정은 생성 후 변경 불가
  • non-CDB를 다른 CDB의 PDB로 변경 가능


CDB 구조



CDB 아키텍처
구분내용
인스턴스CDB와 모든 PDB들은 동일한 인스턴스를 공유한다.
동일한 SGA 메모리 구조를 공유하고 메모리를 구성하는데 사용되는 파라미터는 한 개만 존재한다.
CDBCDB는 전체 데이터베이스로 메타데이터 및 데이터베이스의 데이터를 저장하는 여러 개의 컨테이너가 포함한다.
컨테이너시스템의 메타데이터와 스키마 정보 또는 데이터베이스의 메타데이터와 스키마 데이터를 위한 고유하고 독집적인 저장 위치를 의미한다.
루트 컨테이너각 CDB는 하나의 루트 컨테이너를 포함하고 CDB$ROOT라는 이름을 가진다.
이는 스키마, 스키마 오브젝트 또는 전체 CDB에 속한 비스키마 오브젝트에 대한 위치를 제공한다.
PDB를 관리하는데 필요한 메타데이터 저장한다.


루트 CDB
Seed PDBCDB는 새로운 PDB를 만드는데 사용되는 PDB$SEED라는 PDB를 가지고 있다. PDB$SEED 내에 오브젝트를 추가하거나 변경할 수 없다.
PDB사용자 스키마, 데이터, 코드와 기타 데이터베이스 관련 오브젝트를 담고 있는 유저가 만든 개체이다.
PDB는 CDB 내에서 고유하고 독립된 데이터베이스 환경을 가진다. 하나의 CDB는 복수 개의 PDB를 가질 수 있다.
CDB 인스턴스인스턴스 파라미터, SGA, 백그라운드 프로세스와 같이 일반적인 인스턴스 항목이 포함된 구조이다.
하나 이상의 컨트롤 파일non-CDB와 같이 컨트롤 파일을 다중화 한다. 이 컨트롤 파일은 CDB와 연결된 PDB를 모두 지원한다.
온라인 리두 로그 파일non-CDB와 같이 여러 그룹을 생성하고 다중화 한다. 이 리두 로그가 전체 CDB와 연결된 PDB를 같이 지원한다.
온라인 리두 로그는 루트 컨테이너의 일부로서 저장되는 것으로 간주한다.
CDB가 ARCHIVELOG 모드인 경우 아카이브 파일도 생성한다.
ARCHIVELOG 모드의 변경은 CDB레벨에서만 수행한다.
하나 이상의 Temporary 파일 집합CDB는 디폴트로 TEMP라는 단일 Temporary 테이블 스페이스를 최소한 한 개를 가진다.
이 테이블 스페이스는 CDB와 PDB에 대한 임시 작업에 대한 요청을 처리한다.
CDB는 추가로 Temporary 테이블 스페이스를 생성하거나 정의할 수 있고, PDB마다 Temporary 테이블 스페이스를 생성할 수 있다.
Undo 테이블 스페이스와 관련 Tempfile하나의 UNDO 테이블 스페이스와 tempfile이 non-RAC인 CDB의 루트 컨테이너에 위치한다.
이 UNDO 테이블 스페이스는 CDB와 PDB를 모두 지원한다.
RAC 구성에서 각 노드별로 Undo 테이블 스페이스를 가진다.
SYSTEM과 SYSAUXCDB의 시스템 테이블 스페이스의 데이터 파일에는 루트 컨테이너에 관한 데이터 딕셔너리와 PDB와 관련된 데이터 딕셔너리에 대한 Pointer를 가진다.
CDB는 유저 테이블 스페이스나 유저에 관련되는 데이터 파일을 가지지 않는다.

톰 카이트의 한 마디

12c에서 어떠한 아키텍처를 선택하는 것과는 별개로 SYSTEM이나 SYSAUX 테이블 스페이스에 오브젝트를 생성하지 못하는 것은 기존에 SYS나 SYSTEM 스키마에 유저 오브젝트를 생성하는 못하는 것과 마찬가지로 아무리 강조해도 지나치치 않다.
Internal 계정인 SYS나 SYSTEM 계정으로 관리자 작업 외 목적으로 로그인해서는 안 된다.


CDB 명명

  • 한 데이터베이스 서버에 복수 개의 CDB 또는 non-CDB를 호스팅할 수 있다.(ORACLE_SID로 구분)
  • CDB와 non-CDB의 실행 프로세스는 동일, PDB를 플러그 또는 언플러그 하더라도 CDB의 추가적인 프로세스 없다.(PDB로 접속하는 유저 프로세스 제외)
  • CDB 확인 방법

SQL> select name, cdb from v$database;

NAME			    CDB
--------------------------- ---------
CDB2			    YES


  • CDB와 non-CDB의 인스턴스와 데이터베이스명 제약사항은 동일하다.
  • CDB 장점
1비용절감
2쉽고 간단한 데이터 이동
3오라클 데이터베이스 Resource Manager 지원
4PDB의 독립성
5관리 의무의 세분화된 분리 제공
6손쉬운 퍼포먼스 튜닝
7손쉬운 패치와 업그레이드


CDB 생성에 필요한 버전

  • 오라클 데이터베이스 12c 이상 버전상에서만 CDB 지원한다.(COMPATIBLE 파라미터 값이 12.0.0.0 이상)
  • CDB에 플러그 하는 CDB나 PDB는 COMPATIBLE 값이 같아야 한다.
  • 오라클 11g를 PDB로써 12c의 CDB에 플러그는 할 수 없다.

톰 카이트의 한 마디

CDB를 업그레이드/패치할 때 동시에 관련된 PDB를 모두 적용하거나 선택해서 일부만 적용할 수 있다.
패치를 적용하거나 다음 릴리스로 업그레이드할 때 기존에 존재했던 데이터베이스를 업그레이드하는 대신에 새로운 멀티테넌트 DB 인스턴스를 구성하도록 선택할 수 있다.
그런 다음 PDB를 업그레이드/패치하고 기존의 CDB로부터 간단히 몇 초 안에 언플러그해서 새로운 CDB로 플러그 할 수 있다.
이 방식으로 새로운 릴리스에서 각각의 애플리케이션을 테스트하는 목적으로 며칠 또는 몇 주 간의 과정을 통해 PDB를 업그레이드/패치 할 수 있다.


CDB 루트 컨테이너

  • CDB를 생성할 때 루트 컨테이너도 생성, 각 CDB는 단 하나의 루트 컨테이너를 가진다.
  • 루트 컨테이너에 CDB 자체에 대한 시스템 정보와 멀티테넌트의 핵심이 되는 모든 PDB에 필요한 메타데이터가 저장된다.
  • 루트 컨테이너는 Global 데이터베이스 관리자 작업을 위해서 사용되고, CDB$ROOT라는 컨테이너명을 사용한다.


CDB common 유저

  • common 유저는 12c에서 나온 새로운 유저 타입이다.
  • common 유저는 CDB와 복수 개의 PDB에 할당 될 수 있다.
  • common 유저는 CDB와 모든 PDB에서 DBA에 의해 관리될 수 있다.
  • common 유저는 CDB와 모든 PDB에 접근할 수 있고, 가장 강력한 common 유저는 SYS이다.
  • common 유저는 ORACLE_SID 변수를 설정해서 CDB로 직접 접속해서 간단히 데이터베이스로 로그인 할 수 있다.
  • common 유저는 루트 컨테이너와 모든 PDB에서 동일하게 식별한다.
  • common 유저의 권한은 각 PDB 내에서 별도로 관리할 수 있다.
  • CDB와 모든 PDB에서 common 유저를 만들 수 있으며, common 유저명은 C##으로 시작해야 한다.(SYS, SYSTEM 예외)
  • 권고사항: common 유저는 루트 컨테이너에 오브젝트 생성 권한을 가지지만 가급적이면 루트 컨테이너에 생성하지 않도록 한다.(= non-CDB에서 SYS 스키마로 유저 오브젝트를 생성하는 않는 것과 유사)
  • common 유저 생성과 삭제

SQL> create user black identified by black container=all;
create user black identified by black container=all
            *
ERROR at line 1:
ORA-65096: invalid common user or role name


SQL> create user c##black identified by black container=all;

User created.

SQL>
SQL> create user c##white identified by white;

User created.

SQL> create user c##gray identified by gray container=current;
create user c##gray identified by gray container=current
            *
ERROR at line 1:
ORA-65094: invalid local user or role name

SQL> drop user c##white cascade;

User dropped.

"구루비 데이터베이스 스터디모임" 에서 2016년에 "클라우드 데이터베이스 Oracle 12c 가이드" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4283

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 아발란체 [2023.11.28 16:13:31]

이해를 위한 추가적인 내용으로

글만 보면 CDB가 더 좋아보이고
오라클 설치 강좌들은 설명 없이 컨테이너 DB 생성 옵션은 해지하고 설치하라는 말만 있어 확인 결과
 

쉽게 기본 DB는 Single-DB(~ Oracle11g), 1개 DB만 운영
CDB는 Logical Multi-DB(MultiTenant) 개념으로 1개 이상 DB 운영 최적화

즉 개발 테스트용으로 CDB 무의미(효과 없거나 적음)
하드웨어적으로 DB 서버 10개 이상 있고 평균 가용율이 20%라고 했을 때 
(물리적)하드웨어 1대에서 20% * 기존 DB 5개 = 100%
식으로 낭비를 줄이자는 컨셉으로 CBD로 여러 DB를 묶여(=논리적) 낭비를 줄이고 가용율을 높이자는 방법

DB를 다 합쳤을 때 가용율이 100% 만들면
리소스 사용 100% 초과 발생 시, 병목 현상으로 인한 대기열, 속도 저하가 있기 때문에
감안하여 논리적으로 DB를 묶어 효율적으로 서비스 할 수 있다는 개념

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입