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마다 다음과 같은 자원을 컨트롤 할 수 있다.
1 | CPU |
2 | 세션 |
3 | 병렬 서버 프로세스 |
4 | 시스템상의 PDB와 CDB 간의 DISK I/O 리소스(엑사데이터인 경우) |
- PDB에서 share라는 수치를 통해 CPU를 분할하고 각 share는 얼마나 많은 CPU 자원을 할당할지에 대해 정의한다.
- 이는 항상 CPU에 대한 가용성을 유지하고 PDB의 사용할 수 있는 최소 CPU 수를 보장하기 위해 사용한다.
- share 예제
1 | MYPDB | 2 share |
2 | ORCL | 1 share |
3 | YOURPDB | 1 share |
- share의 합계는 4개로 총량을 나타낸다.
- MYPDB는 2 share로 총 CPU 리소스의 50% 사용률을 보장 받는다.
- ORCL과 YOURPDB는 1 share로 총 CPU 리소스의 25% 사용률을 보장 받는다.
- 또한, 오라클 데이터베이스 리소스 매니저로 특정 PDB의 CPU 사용률 제한 설정할 수 있다.
CDB와 PDB의 관리
- 멀티테넌트 데이터베이스의 관리는 이전 버전의 데이터베이스 관리와 크게 다르지 않지만, 새로운 구조인 CDB와 PDB에 관한 추가적인 관리 작업이 있다.
- CDB의 관리
- CDB 인스턴스 시작
1 | CDB를 시작할 권한을 가진 유저 계정으로만 CDB 루트 컨테이너로 접속할 수 있다. |
2 | PDB는 CDB가 오픈될 때 마운트 된다. |
3 | startup 명령의 startup open recover란 새로운 옵션은 데이터베이스를 자동으로 recovery 모드로 시작하고 오픈한다. |
common 유저의 생성과 관리
- non-CDB에서 수행하는 대부분의 작업은 CDB에서도 수행할 수 있다. (예를 들어 테이블 스페이스를 추가하고, 이 추가된 테이블 스페이스에 common 유저 소유의 오브젝트 생성이 가능하다.)
- 온라인 리두 로그 파일과 컨트롤 파일은 CDB에서 관리한다.
- CDB에서만 UNDO 테이블 스페이스를 가지고 CDB와 모든 PDB에서 사용한다.
- alert 로그는 CDB에 속해 있지만, PDB에 관련되는 정보도 포함된다.
- CDB를 삭제하면 그 CDB 내 모든 PDB도 삭제된다.
PDB 관리
1 | CDB_PDBS 또는 DBA_PDBS 뷰는 PDB에 대한 name, status 등의 정보를 제공한다. |
2 | V$CONTAINERS 뷰는 컨테이너의 opent_mode와 기타 정보를 제공한다. |
3 | V$PDBS 뷰는 개별적인 PDB가 언제 오픈되었는지, 현재 open_mode, restriced세션 모드로 열렸는지에 대한 정보를 제공한다. |
4 | CDB_PDB_HISTORY는 PDB에 대한 이력 정보를 제공한다. |
1 | CON_NAME_TO_ID | 컨테이너명을 입력해서 컨테이너 ID를 반환 |
2 | CON_DBID_TO_ID | 컨테이너 DBID를 입력해서 컨테이너 ID를 반환 |
3 | CONTAINER_UID_TO_ID | CONTAINER_UID를 입력해서 컨테이너 ID를 반환 |
4 | CONTAINER_GUID_TO_ID | CONTAINER_GUID를 입력해서 컨테이너 ID를 반환 |
1 | startup force | PDB 셧다운 이후에 재시작한다. |
2 | startup restrict | PDB를 제한 세션 모드로 시작한다. restricted session 권한을 가진 유저만이 데이터베이스로 접속이 가능하다. |
3 | startup, startup open | 데이터베이스 시작. READ WRITE(디폴트) 또는 READ ONLY 모드(startup open read only) 모드가 가능하다. |
4 | shutdown | PDB를 모든 세션이 연결이 종료된 이후에 일관성 있게 close한다. |
5 | shutdown immediate | active 상태이거나 실행 중인 세션을 kill시키고 일관성 있는 모드로 PDB를 종료시킨다. |
6 | shutdown abort | PDB를 비일관성 상태로 셧다운시킨다. |
7 | shutdown transactional | 진행 중인 트랜잭션이 종료되기를 기다렸다가 PDB를 종료한다. |
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;
SQL> alter pluggable database storage(maxsize 2g);
SQL> alter pluggable database storage(maxsize unlimited);
1 | alter system flush shared_pool |
2 | alter system flush buffer_cache |
3 | alter system enable restricted session |
4 | alter system disable restricted session |
5 | alter system set use_stored_outlines |
6 | alter system resume |
7 | alter system check datafiles |
8 | alter system kill session |
9 | alter system set initialization_parameter |
10 | alter system suspend |
11 | alter system checkpoint |
12 | alter system register |
13 | alter 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 복구 |
2 | Point-in-time 복구 |
3 | 테이블 스페이스 Point-in-time 복구 |
4 | 복구 카탈로그 접속 |
5 | Report/Delete obsolete |
6 | configure 명령을 통한 RMAN 설정 변경 |
7 | reset database |
8 | import catalog |
9 | register database |
10 | Data Recovery Adviser |
11 | RMAN에서의 플래시백 작업 |
12 | duplicate 데이터베이스 |
13 | Table 복구 |
전체 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 참조)