클라우드 데이터베이스 Oracle 12c 가이드 (2016년)
오라클 멀티테넌트 0 0 36,880

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


non-CDB를 PDB로 플러그


SQL> select name, cdb from v$database;

NAME                        CDB
--------------------------- ---------
UPGR                        NO

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup open read only;
ORACLE instance started.

Total System Global Area  826277888 bytes
Fixed Size                  2929792 bytes
Variable Size             322964352 bytes
Database Buffers          494927872 bytes
Redo Buffers                5455872 bytes
Database mounted.
Database opened.

SQL> exec DBMS_PDB.DESCRIBE('/tmp/pbd1.xml');

PL/SQL procedure successfully completed.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> select name, cdb from v$database;

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

SQL> DECLARE
  2  compatible CONSTANT VARCHAR2(3) := CASE
  3  DBMS_PDB.CHECK_PLUG_COMPATIBILITY( pdb_descr_file => '/tmp/pbd1.xml',
  4  pdb_name => 'PDB1') WHEN TRUE THEN 'YES' ELSE 'NO'
  5  END;
  6  BEGIN
  7  DBMS_OUTPUT.PUT_LINE(compatible);
  8  END;
  9  /
NO

PL/SQL procedure successfully completed.

SQL> select name,cause,type, status, message
  from PDB_PLUG_IN_VIOLATIONS
where name='PDB1';

NAME	   CAUSE		TYPE	   STATUS
---------- -------------------- ---------- ----------
MESSAGE
--------------------------------------------------------------------------------
PDB1	   Non-CDB to PDB	WARNING    PENDING
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.

PDB1	   OPTION		WARNING    PENDING
Database option DV mismatch: PDB installed version NULL. CDB installed version
12.1.0.2.0.

PDB1	   OPTION		WARNING    PENDING
Database option ORDIM mismatch: PDB installed version NULL. CDB installed

NAME	   CAUSE		TYPE	   STATUS
---------- -------------------- ---------- ----------
MESSAGE
--------------------------------------------------------------------------------
version 12.1.0.2.0.

PDB1	   OPTION		WARNING    PENDING
Database option SDO mismatch: PDB installed version NULL. CDB installed version
12.1.0.2.0.

PDB1	   APEX 		WARNING    PENDING
APEX mismatch: PDB installed version NULL CDB installed version 4.2.5.00.08


NAME	   CAUSE		TYPE	   STATUS
---------- -------------------- ---------- ----------
MESSAGE
--------------------------------------------------------------------------------
PDB1	   Parameter		WARNING    PENDING
CDB parameter processes mismatch: Previous 300 Current 200

PDB1	   Parameter		WARNING    PENDING
CDB parameter sessions mismatch: Previous 472 Current 322

PDB1	   Parameter		WARNING    PENDING
CDB parameter sga_target mismatch: Previous 788M Current 1000M


NAME	   CAUSE		TYPE	   STATUS
---------- -------------------- ---------- ----------
MESSAGE
--------------------------------------------------------------------------------
PDB1	   Parameter		WARNING    PENDING
CDB parameter compatible mismatch: Previous '12.1.0' Current '12.1.0.2.0'

PDB1	   SQL patch error	ERROR	   PENDING
(PSU bundle patch 5 (Database Patch Set Update : 12.1.0.2.5 (21359755)): APPLY SUCCESS):  with status	in the PDB.

PDB1	   SQL patch error	ERROR	   PENDING
(SQL patch ID/UID 21539301/19298399 (): APPLY SUCCESS):  with status  in the PDB.

NAME	   CAUSE		TYPE	   STATUS
---------- -------------------- ---------- ----------
MESSAGE
--------------------------------------------------------------------------------

PDB1	   SQL Patch		ERROR	   PENDING
PSU bundle patch 5 (Database Patch Set Update : 12.1.0.2.5 (21359755)):
Installed in the CDB but not in the PDB.

PDB1	   SQL Patch		ERROR	   PENDING
SQL patch ID/UID 21539301/19298399 (): Installed in the CDB but not in the PDB.


13 rows selected.

SQL> create pluggable database PDB1 using '/tmp/pbd1.xml' nocopy tempfile reuse;

Pluggable database created.

SQL> alter session set container=PDB1;

Session altered.

SQL> @?/rdbms/admin/noncdb_to_pdb.sql

SQL> SET SERVEROUTPUT ON
SQL> SET FEEDBACK 1
SQL> SET NUMWIDTH 10
SQL> SET LINESIZE 80
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE 100
SQL>
SQL> WHENEVER SQLERROR EXIT;
SQL>
SQL> DOC
DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01403: no data found"
DOC>   error if we're not in a PDB.
DOC>   This script is intended to be run right after plugin of a PDB,
DOC>   while inside the PDB.
DOC>#######################################################################
DOC>#######################################################################
DOC>#
SQL>
SQL> VARIABLE cdbname VARCHAR2(128)
SQL> VARIABLE pdbname VARCHAR2(128)
SQL> BEGIN
  2    SELECT sys_context('USERENV', 'CDB_NAME')
  3      INTO :cdbname
  4      FROM dual
  5      WHERE sys_context('USERENV', 'CDB_NAME') is not null;
  6    SELECT sys_context('USERENV', 'CON_NAME')
  7      INTO :pdbname
  8      FROM dual
  9      WHERE sys_context('USERENV', 'CON_NAME') <> 'CDB$ROOT';
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL>
SQL> COLUMN pdbname NEW_VALUE pdbname
SQL> COLUMN pdbid NEW_VALUE pdbid
SQL>
SQL> select :pdbname pdbname from dual;

PDBNAME
--------------------------------------------------------------------------------
PDB1

1 row selected.

(중간생략)

SQL> alter session set container = "&pdbname";

Session altered.

SQL> -- leave the PDB in the same state it was when we started
SQL> BEGIN
  2    execute immediate '&open_sql &restricted_state';
  3  EXCEPTION
  4    WHEN OTHERS THEN
  5    BEGIN
  6      IF (sqlcode <> -900) THEN
  7        RAISE;
  8      END IF;
  9    END;
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> WHENEVER SQLERROR CONTINUE;

SQL> startup
Pluggable Database opened.
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB1                           READ WRITE NO


통합 도구로서 오라클 멀티테넌트 사용

  • 통합(consolidation)이라는 개념은 IT 인프라의 반중앙 현상을 해결하기 위해 나왔다.
  • 오라클 멀티테넌트는 기존의 non-CDB를 CDB로 통합함으로써 하드웨어 자원을 최대한 활용하고 심지어 하드웨어에 대한 요구 사항을 줄일 수 있는 하나의 솔루션이다.


오라클 멀티테넌트와 리소스 관리

  • 한 CDB에서 여러 PDB가 상주하게 되면 서로의 성능에 영향을 줄 수 있기 때문에 오라클 데이터베이스 리소스 매니저는 PDB마다 다음과 같은 자원을 컨트롤 할 수 있다.
1CPU
2세션
3병렬 서버 프로세스
4시스템상의 PDB와 CDB 간의 DISK I/O 리소스(엑사데이터인 경우)
  • PDB에서 share라는 수치를 통해 CPU를 분할하고 각 share는 얼마나 많은 CPU 자원을 할당할지에 대해 정의한다.
  • 이는 항상 CPU에 대한 가용성을 유지하고 PDB의 사용할 수 있는 최소 CPU 수를 보장하기 위해 사용한다.
  • share 예제
1MYPDB2 share
2ORCL1 share
3YOURPDB1 share
  • share의 합계는 4개로 총량을 나타낸다.
  • MYPDB는 2 share로 총 CPU 리소스의 50% 사용률을 보장 받는다.
  • ORCL과 YOURPDB는 1 share로 총 CPU 리소스의 25% 사용률을 보장 받는다.
  • 또한, 오라클 데이터베이스 리소스 매니저로 특정 PDB의 CPU 사용률 제한 설정할 수 있다.


CDB와 PDB의 관리

  • 멀티테넌트 데이터베이스의 관리는 이전 버전의 데이터베이스 관리와 크게 다르지 않지만, 새로운 구조인 CDB와 PDB에 관한 추가적인 관리 작업이 있다.
  • CDB의 관리
  • CDB 인스턴스 시작
1CDB를 시작할 권한을 가진 유저 계정으로만 CDB 루트 컨테이너로 접속할 수 있다.
2PDB는 CDB가 오픈될 때 마운트 된다.
3startup 명령의 startup open recover란 새로운 옵션은 데이터베이스를 자동으로 recovery 모드로 시작하고 오픈한다.


common 유저의 생성과 관리

  • non-CDB에서 수행하는 대부분의 작업은 CDB에서도 수행할 수 있다. (예를 들어 테이블 스페이스를 추가하고, 이 추가된 테이블 스페이스에 common 유저 소유의 오브젝트 생성이 가능하다.)
  • 온라인 리두 로그 파일과 컨트롤 파일은 CDB에서 관리한다.
  • CDB에서만 UNDO 테이블 스페이스를 가지고 CDB와 모든 PDB에서 사용한다.
  • alert 로그는 CDB에 속해 있지만, PDB에 관련되는 정보도 포함된다.
  • CDB를 삭제하면 그 CDB 내 모든 PDB도 삭제된다.


PDB 관리

  • PDB에 관련된 새로운 뷰
1CDB_PDBS 또는 DBA_PDBS 뷰는 PDB에 대한 name, status 등의 정보를 제공한다.
2V$CONTAINERS 뷰는 컨테이너의 opent_mode와 기타 정보를 제공한다.
3V$PDBS 뷰는 개별적인 PDB가 언제 오픈되었는지, 현재 open_mode, restriced세션 모드로 열렸는지에 대한 정보를 제공한다.
4CDB_PDB_HISTORY는 PDB에 대한 이력 정보를 제공한다.
  • 컨네이너 ID 확인 함수
1CON_NAME_TO_ID컨테이너명을 입력해서 컨테이너 ID를 반환
2CON_DBID_TO_ID컨테이너 DBID를 입력해서 컨테이너 ID를 반환
3CONTAINER_UID_TO_IDCONTAINER_UID를 입력해서 컨테이너 ID를 반환
4CONTAINER_GUID_TO_IDCONTAINER_GUID를 입력해서 컨테이너 ID를 반환
  • PDB의 open, close
1startup forcePDB 셧다운 이후에 재시작한다.
2startup restrictPDB를 제한 세션 모드로 시작한다. restricted session 권한을 가진 유저만이 데이터베이스로 접속이 가능하다.
3startup, startup open데이터베이스 시작. READ WRITE(디폴트) 또는 READ ONLY 모드(startup open read only) 모드가 가능하다.
4shutdownPDB를 모든 세션이 연결이 종료된 이후에 일관성 있게 close한다.
5shutdown immediateactive 상태이거나 실행 중인 세션을 kill시키고 일관성 있는 모드로 PDB를 종료시킨다.
6shutdown abortPDB를 비일관성 상태로 셧다운시킨다.
7shutdown transactional진행 중인 트랜잭션이 종료되기를 기다렸다가 PDB를 종료한다.
  • CDB에서 PDB open, close

SQL> SHOW PDBS

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 PDB1 			  MOUNTED
	 4 PDB3 			  READ WRITE NO

SQL> alter pluggable database PDB1 open;

Pluggable database altered.

SQL>
SQL>
SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 PDB1 			  READ WRITE NO
	 4 PDB3 			  READ WRITE NO
SQL>

  • PDB에서 디폴트 테이블 스페이스와 디폴트 Temporary 테이블 스페이스 설정

SQL> alter pluggable database default tablesapce pdb_tbs;
SQL> alter pluggable database default temporary tablesapce pdb_temp_tbs;

  • PDB의 storage limit 설정

SQL> alter pluggable database storage(maxsize 2g);
SQL> alter pluggable database storage(maxsize unlimited);

  • PDB의 alter system 명령
1alter system flush shared_pool
2alter system flush buffer_cache
3alter system enable restricted session
4alter system disable restricted session
5alter system set use_stored_outlines
6alter system resume
7alter system check datafiles
8alter system kill session
9alter system set initialization_parameter
10alter system suspend
11alter system checkpoint
12alter system register
13alter system disconnect session


CDB와 PDB의 백업과 복구

  • CDB에서 사용 가능한 기존 백업 기능
    • RMAN의 backup database 명령으로 전체 CDB를 백업 할 수 있다.
    • CDB에서 테이블스페이스, 컨트롤 파일, SPFILE 백업은 기존과 동일하다.
    • 단, 루트 컨테이너로 접속해서 백업을 수행해야한다. (RMAN 로그인으로 수행 시는 변경사항 없음)
    • 증분 백업과 섹션 시리즈를 지정한 백업, 태그 추가 등과 같이 일반 백업에서의 기능은 모두 사용할 수 있다.
    • 전체 CDB 복원이 CDB 내의 PDB를 개별적으로 복원하는 것보다 훨씬 빠르기 때문에 전체 CDB 백업 전략이 유용하다.


  • 루트 컨테이너 백업
    • 루트 컨테이너만을 백업하는 RMAN 명령어 BACKUP DATABASE ROOT를 지원한다.
    • 이는 기본적으로 데이터 파일만을 백업하며, 옵션으로 아카이브 파일도 백업할 수 있다.(ACHIVELOG 모드 시)
    • 컨트롤 파일의 자동 백업을 사용하는 경우 SPFILE 및 컨트롤 파일에 대한 AUTOBACKUPS을 수행한다.


  • PDB에서 사용 가능한 백업 기능
    • 루트 컨테이너에서 RMAN을 사용하여 PDB를 개별적으로 백업 할 수 있다.
    • PDB 내에서도 SYSDBA권한을 가진 계정으로 RMAN을 사용하여 백업 할 수 있다.
    • PDB로 접속할 때 RMAN의 제한사항
1아카이브 로그 백업, 삭제, 복원에 관련된 non-media 복구
2Point-in-time 복구
3테이블 스페이스 Point-in-time 복구
4복구 카탈로그 접속
5Report/Delete obsolete
6configure 명령을 통한 RMAN 설정 변경
7reset database
8import catalog
9register database
10Data Recovery Adviser
11RMAN에서의 플래시백 작업
12duplicate 데이터베이스
13Table 복구
전체 CDB 복구
    • 일반 복구, point-in-time 복구, 플래시백 작업 등 대부분의 non-CDB이 복구 작업과 동일하다.
  • 루트 컨테이너 복구
    • RMAN에서 루트 컨테이너만을 복구하는 restore database root, recover database root 명령을 지원한다.
    • 단, 오라클은 전체 CDB복구를 권장한다.
  • PDB 복구
    • 백업과 마찬가지로 루트 컨테이너 또는 PDB 내 복구 방법을 지원한다.
    • PDB 내에서 복구 시 현재 PDB만을 복구할 수 있고, 루트 컨테이너에서는 모든 PDB를 복구할 수 있다.
  • CDB와 PDB에서 기타 백업과 복구
    • 오라클 데이터 펌프, 오라클 데이터베이스 플래시백 기능을 사용할 수 있다.
    • 오라클 데이터 펌프는 CDB와 PDB를 지원하지만, CDB와 모든 PDB를 포함한 전역적인 익스포트/임포트 작업은 지원하지 않는다.
    • 각 PDB로 접속해서 익스포트/임포트를 수행해야 한다.
    • 데이터 펌프를 사용해서 CDB의 PDB를 다른 CDB로 옮길 수 있다. 단, 현재 소스 데이터베이스에 common 유저가 존재한다면 이 유저는 임포트 시 타깃 데이터베이스에 이 유저를 생성하지 못한다. common 유저가 실제로 익스포트 되었다고 하더라도 새로운 PDB로 임포트하는 동안에 에러가 발생한다.
    • common 유저를 정상적으로 임포트하기 원한다면 타깃 CDB에 먼저 이 common 유저를 생성한다.
    • 플래시백 데이터베이스 기능은 CDB와 PDB를 지원하지만 몇 가지 문제가 있다.(Oracle Database Backup and Recovery User's Guide의 outlier 참조)
"구루비 데이터베이스 스터디모임" 에서 2016년에 "클라우드 데이터베이스 Oracle 12c 가이드" 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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