1. PDB 생성 방법
PDB 생성 시,
PDB$SEED를 이용하거나(Creating a PDB by Using the Seed)
기존의 PDB를 이용하거나(Cloning a PDB From an Existing PDB)
기존의 PDB를 unplug 해서 xml파일 등으로 만들어둔 PDB를 이용(Plugging a PDB into a CDB)하는 것이 가능하다.
을 할 수 있다.
상세한 내용은 CREATE PLUGGABLE DATABASE (oracle.com) 에서 자세히 확인이 가능하며, 여기에서는 PDB$SEED를 이용한 PDB 생성에 대해서만 기재하였다.
2. PDB 생성
아래는 PDB생성 예제이다.
PDB 생성 및 제거를 위해서는 CDB$ROOT에 접속된 상태여야 한다.
접속과 관련된 내용은 ORACLE Multitenant (CDB/PDB) 접속 관련 설정 및 확인 명령어 (it-indexes.blogspot.com) 내용을 참고한다.
CREATE PLUGGABLE DATABASE PDB3 ADMIN USER PDBADMIN IDENTIFIED BY oracle ROLES = (PDB_DBA) FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ORCL/pdbseed', '/u01/app/oracle/oradata/ORCL/pdb3') ; |
SQL> show pdbs ; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 MOUNTED 5 PDB3 MOUNTED |
SEED를 통해서 생성 시 해당 명령에서 필수로 기재해 주어야 할 옵션은 아래와 같다.
ADMIN USER ... ROLES = ...구문 : 해당 PDB의 ADMIN이 될 계정을 생성하는 구문이다. ROLE에 DBA 또는 PDB_DBA를 사용해야 한다.
FILE_NAME_CONVERT = PDB$SEED가 가지고 있는 Data File로 대표되는 Physical File들이 복사될 위치를 지정한다.
또한 별도의 TABLESPACE/Data File 등을 생성할 경우 PATH_PREFIX 등의 옵션이 존재하며, 옵션 자체가 매우 많기도 하고, PDB 생성 후에 별도 DDL문을 준비하여 적용 할 수 있는 부분들이기 때문에,
PDB 생성시에 바로 적용하고 싶은 옵션들은 CREATE PLUGGABLE DATABASE (oracle.com) 을 참고해서 생성하도록 한다.
생성된 PDB는 Closed (OPEN MODE 상으로는 MOUNTED) 상태이므로 기동이 필요하다.
PDB 기동 및 정지에 관한 내용은 ORACLE PDB 관리 1 (시작/종료) (SAVE/DISCARD STATE) (it-indexes.blogspot.com) 내용을 참고한다.
3. PDB 제거
PDB의 제거가 필요한 경우 해당 PDB Data File을 남겨두거나, 모두 함께 제거하는 옵션을 줄 수 있다.
PDB의 제거 전, 해당 PDB는 Closed(OPEN MODE 기준 MOUNTED) 상태여야 한다.
3.1. KEEP DATAFILES
DROP PLUGGABE DATABASE만 수행하는 경우 KEEP DATAFILES가 Default 옵션이며, 이 옵션을 사용 하는 경우, PDB의 UNPLUG가 우선되어야 한다.
SQL> drop pluggable database pdb3 ; drop pluggable database pdb3 * ERROR at line 1: ORA-65179: cannot keep datafiles for a pluggable database that is not unplugged SQL> alter pluggable database pdb3 unplug into '/home/oracle/pdb3.xml' ; Pluggable database altered. SQL> drop pluggable database pdb3 ; Pluggable database dropped. SQL> show pdbs ; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 MOUNTED 6 PDB4 MOUNTED SQL> !ls -al $ORACLE_BASE/oradata/ORCL/pdb3 total 640028 drwxr-x---. 2 oracle dba 67 Jun 21 05:03 . drwxr-x---. 7 oracle dba 4096 Jun 21 05:04 .. -rw-r-----. 1 oracle dba 173023232 Jun 21 04:56 sysaux01.dbf -rw-r-----. 1 oracle dba 220209152 Jun 21 04:56 system01.dbf -rw-r-----. 1 oracle dba 262152192 Jun 21 04:56 undotbs01.dbf |
이렇게 KEEP 상태가 된 PDB는 '/home/oracle/pdb3.xml' 파일을 통해 추후 다시 Plug 하여 사용 할 수 있다.
3.2. INCLUDING DATAFILES
해당 옵션을 함께 입력해 주면 DB의 UNPLUGGED 여부에 상관 없이 DATAFILE과 함께 PDB가 제거된다.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 MOUNTED 6 PDB4 MOUNTED SQL> drop pluggable database pdb4 including datafiles ; Pluggable database dropped. SQL> !ls -al $ORACLE_BASE/oradata/ORCL/pdb4 total 4 drwxr-x---. 2 oracle dba 6 Jun 21 05:07 . drwxr-x---. 7 oracle dba 4096 Jun 21 05:04 .. |
4. Tablespace 및 Data File 관리
4.1. Tablespace 조회
PDB의 Tablespace는 cdb_tablespaces 딕셔너리를 통해 확인 할 수 있다.
단, 해당 PDB가 OPEN 상태여야 한다. 또한 cdb_tablespaces 뷰에는 PDB의 이름에 대한 컬럼이 존재하지 않는다.
따라서 v$pdbs, cdb_pdbs, v$containers 등의 뷰와 조인해야 한다.
또한 cdb_ … 뷰는 PDB에 접속한 상태에서는 PDB의 정보만 출력한다.
※ CDB$ROOT와 PDB$SEED는 반드시 CON_ID 1,2를 차지하도록 되어 있기때문에,
ORACLE 공식 Document에서도 PDB에 대한 정보만 원하는 경우 con_id > 2 절을 통해서 볼 것을 권장하고 있다.
col pdb_name for a20 col tablespace_name for a20 col status for a10 select df.con_id, p.name as pdb_name, p.open_mode, tablespace_name, status from cdb_tablespaces df ,v$pdbs p where df.con_id(+)=p.con_id and p.con_id > 2 ; CON_ID PDB_NAME OPEN_MODE TABLESPACE_NAME STATUS ---------- -------------------- -------------------- -------------------- ---------- 3 PDB1 READ WRITE SYSTEM ONLINE 3 PDB1 READ WRITE SYSAUX ONLINE 3 PDB1 READ WRITE UNDOTBS1 ONLINE 3 PDB1 READ WRITE TEMP ONLINE 3 PDB1 READ WRITE USERS ONLINE PDB2 MOUNTED 6 rows selected. |
4.2. Tablespace 관리
Tabpespace의 관리는 직접 해당 PDB에 접속하여 진행해야 한다.
4.2.1. Tablespace 생성
Tablespace생성은 작업 대상 PDB에 직접 접속한 상태라면, non-CDB에서와 같은 방식으로 TABLESPACE 추가/제거가 가능하다.
제약사항 : 작업 PDB에 접속해야 가능.
사용가능 구문 : non-CDB와 동일.
CON_NAME ------------------------------ PDB1 SQL> alter session set container=PDB1 ; Session altered. SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> create tablespace TEST_TBS datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' size 10M autoextend on ; Tablespace created. CON_ID PDB_NAME OPEN_MODE TABLESPACE_NAME STATUS ---------- -------------------- -------------------- -------------------- ---------- 3 PDB1 READ WRITE SYSTEM ONLINE 3 PDB1 READ WRITE SYSAUX ONLINE 3 PDB1 READ WRITE UNDOTBS1 ONLINE 3 PDB1 READ WRITE TEMP ONLINE 3 PDB1 READ WRITE USERS ONLINE 3 PDB1 READ WRITE TEST_TBS ONLINE SQL> alter tablespace TEST_TBS offline ; Tablespace altered. SQL> drop tablespace TEST_TBS including contents and datafiles ; Tablespace dropped. CON_ID PDB_NAME OPEN_MODE TABLESPACE_NAME STATUS ---------- -------------------- -------------------- -------------------- ---------- 3 PDB1 READ WRITE SYSTEM ONLINE 3 PDB1 READ WRITE SYSAUX ONLINE 3 PDB1 READ WRITE UNDOTBS1 ONLINE 3 PDB1 READ WRITE TEMP ONLINE 3 PDB1 READ WRITE USERS ONLINE |
4.2.2. Default Tablespace
Default Tablespace 설정은 작업 대상 PDB에 직접 접속한 상태라면 non-CDB에서와 같은 방식으로 작업 가능하며, alter pluggable database … 구문으로도 설정 가능하다.
제약사항 : 작업 PDB에 접속해야 가능. (CDB LEVEL에서 작업 시, ORA-65046 에러 출력)
사용 가능 구문 :
alter pluggable database {PDB_NAME} default tablespace {TABLESPACE_NAME} ; alter pluggable database {PDB_NAME} default temporary tablespace {TEMP_TABLESPACE_NAME} ; alter database default tablespace {TABLESPACE_NAME} ; alter database default temporary tablespace {TEMP_TABLESPACE_NAME} ; |
※ ORACLE에서 alter pluggable/alter database 두 구문 중, 어떤 구문을 사용할지 Recommend 하는 문서를 아직까지 발견하지 못함.
다만, 사용자 실수로 다른 Container에서 작업을 할 위험이 있으므로 alter pluggable database … 구문을 이용하는 것이 안전하다고 판단됨.
SQL> alter session set container=CDB$ROOT ; Session altered. SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> alter pluggable database pdb1 default tablespace users ; alter pluggable database pdb1 default tablespace users * ERROR at line 1: ORA-65046: operation not allowed from outside a pluggable database SQL> alter pluggable database pdb1 default temporary tablespace temp_test ; alter pluggable database pdb1 default temporary tablespace temp * ERROR at line 1: ORA-65046: operation not allowed from outside a pluggable database SQL> alter session set container=PDB1 ; Session altered. SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> alter pluggable database pdb1 default tablespace users; Pluggable database altered. SQL> create temporary tablespace temp_test tempfile '/u01/app/oracle/oradata/ORCL/pdb1/temp_test01.dbf' size 50M autoextend on ; Tablespace created. SQL> alter pluggable database pdb1 default temporary tablespace temp_test ; Pluggable database altered. SQL> alter database default tablespace users ; Database altered. SQL> alter database default temporary tablespace temp ; Database altered. col property_name for a30 col property_value for a20 col description for a50 select * from database_properties where property_name like 'DEFAULT%' ; PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ------------------------------ -------------------- -------------------------------------------------- DEFAULT_TBS_TYPE SMALLFILE Default tablespace type DEFAULT_EDITION ORA$BASE Name of the database default edition DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace |
4.3. Data File 조회
PDB의 Data File은 cdb_data_files 딕셔너리를 통해 확인 할 수 있다.
단, 해당 PDB가 OPEN 상태여야 한다. 또한 cdb_data_files 뷰에는 PDB의 이름에 대한 컬럼이 존재하지 않는다.
따라서 v$pdbs, cdb_pdbs, v$containers 등의 뷰와 조인해야 한다.
또한 cdb_ … 뷰는 PDB에 접속한 상태에서는 PDB의 정보만 출력한다.
※ CDB$ROOT와 PDB$SEED는 반드시 CON_ID 1,2를 차지하도록 되어 있기때문에,
ORACLE 공식 Document에서도 PDB에 대한 정보만 원하는 경우 con_id > 2 절을 통해서 볼 것을 권장하고 있다.
col name for a20 col tablespace_name for a20 col file_name for a50 select df.con_id, p.name, p.open_mode, tablespace_name, file_name from cdb_data_files df ,v$pdbs p where df.con_id(+)=p.con_id and p.con_id > 2 ; CON_ID NAME OPEN_MODE TABLESPACE_NAME FILE_NAME ---------- -------------------- -------------------- -------------------- -------------------------------------------------- PDB2 MOUNTED PDB1 MOUNTED 2 rows selected. SQL> alter pluggable database all open ; Pluggable database altered. CON_ID NAME OPEN_MODE TABLESPACE_NAME FILE_NAME ---------- -------------------- -------------------- -------------------- -------------------------------------------------- 3 PDB1 READ WRITE UNDOTBS1 /u01/app/oracle/oradata/ORCL/pdb1/undotbs01.dbf 3 PDB1 READ WRITE SYSAUX /u01/app/oracle/oradata/ORCL/pdb1/sysaux01.dbf 3 PDB1 READ WRITE USERS /u01/app/oracle/oradata/ORCL/pdb1/users01.dbf 3 PDB1 READ WRITE SYSTEM /u01/app/oracle/oradata/ORCL/pdb1/system01.dbf 4 PDB2 READ WRITE SYSTEM /u01/app/oracle/oradata/ORCL/pdb2/system01.dbf 4 PDB2 READ WRITE SYSAUX /u01/app/oracle/oradata/ORCL/pdb2/sysaux01.dbf 4 PDB2 READ WRITE UNDOTBS1 /u01/app/oracle/oradata/ORCL/pdb2/undotbs01.dbf 4 PDB2 READ WRITE USERS /u01/app/oracle/oradata/ORCL/pdb2/users01.dbf 8 rows selected. |
[Data File 조회 예제 (Data File 사용량 조회)]
set line 250 set pages 500 col container_name for a20 col tablespace_name for a20 col file_name for a50 SELECT A.CON_ID ,C.NAME CONTAINER_NAME ,A.TABLESPACE_NAME ,ROUND(A.BYTES_ALLOC / 1024 / 1024 / 1024, 2) CURRENT_SIZE ,ROUND(NVL(B.BYTES_FREE, 0) / 1024 / 1024 / 1024, 2) FREE_SIZE ,ROUND((A.BYTES_ALLOC - NVL(B.BYTES_FREE, 0)) / 1024 / 1024 / 1024, 2) USED_SIZE ,ROUND((NVL(B.BYTES_FREE, 0) / A.BYTES_ALLOC) * 100,2) FREE_RATE ,100 - ROUND((NVL(B.BYTES_FREE, 0) / A.BYTES_ALLOC) * 100,2) USED_RATE ,ROUND(MAXBYTES/1048576,2) MAX_SIZE FROM (SELECT CON_ID ,F.TABLESPACE_NAME ,SUM(F.BYTES) BYTES_ALLOC ,SUM(DECODE(F.AUTOEXTENSIBLE, 'YES',F.MAXBYTES,'NO', F.BYTES))/1024 MAXBYTES FROM CDB_DATA_FILES F GROUP BY CON_ID, TABLESPACE_NAME ) A, (SELECT CON_ID ,F.TABLESPACE_NAME ,SUM(F.BYTES) BYTES_FREE FROM CDB_FREE_SPACE F GROUP BY CON_ID, TABLESPACE_NAME ) B, (SELECT NAME, CON_ID FROM V$CONTAINERS) C WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME (+) AND A.CON_ID = B.CON_ID(+) AND A.CON_ID = C.CON_ID ORDER BY CON_ID, TABLESPACE_NAME ; CON_ID CONTAINER_NAME TABLESPACE_NAME CURRENT_SIZE FREE_SIZE USED_SIZE FREE_RATE USED_RATE MAX_SIZE ---------- -------------------- -------------------- ------------ ---------- ---------- ---------- ---------- ---------- 1 CDB$ROOT SYSAUX .54 .19 .34 35.89 64.11 32 1 CDB$ROOT SYSTEM .68 .24 .44 35.48 64.52 32 1 CDB$ROOT UNDOTBS1 .33 .3 .03 91.25 8.75 32 1 CDB$ROOT USERS 0 0 0 80 20 32 3 PDB1 SYSAUX .16 .04 .12 22.5 77.5 32 3 PDB1 SYSTEM .21 .02 .18 10.6 89.4 32 3 PDB1 UNDOTBS1 .24 .06 .18 25.05 74.95 32 3 PDB1 USERS 0 0 0 80 20 32 4 PDB2 SYSAUX .16 .04 .12 24.58 75.42 32 4 PDB2 SYSTEM .21 .02 .18 10.3 89.7 32 4 PDB2 UNDOTBS1 .24 .09 .16 36.48 63.52 32 4 PDB2 USERS 0 0 0 80 20 32 12 rows selected. SQL> |
4.4. Data File 관리
Data File 관리는 작업 대상 PDB에 직접 접속한 상태라면 non-CDB에서와 같은 방식으로 작업 가능하며, alter pluggable database … 구문으로도 설정 가능하다.
제약사항 : 작업 PDB에 접속해야 가능. (CDB LEVEL에서 작업 시, ORA-65046 에러 출력)
사용 가능 구문 :
alter pluggable database {PDB_NAME} datafile {FILE_ID/FILE_NAME} {ONLINE/OFFLINE} ; alter database datafile {FILE_ID/FILE_NAME} {ONLINE/OFFLINE} ; alter pluggable database {PDB_NAME} recover datafile {FILE_ID/FILE_NAME} ; alter database recover datafile {FILE_ID/FILE_NAME} ; |
등등... 매우 많은 구문을 지원하며, 대부분 non-CDB 환경에서 사용 가능한 구문의 변형이다. 상세 내용은 ALTER PLUGGABLE DATABASE (oracle.com)를 참고.
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> alter pluggable database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' offline ; alter pluggable database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' offline * ERROR at line 1: ORA-65046: operation not allowed from outside a pluggable database SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' offline ; alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' offline * ERROR at line 1: ORA-01516: nonexistent log file, data file, or temporary file "/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf" in the current container SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> alter session set container=PDB1 ; Session altered. SQL> alter pluggable database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' offline ; Pluggable database altered. SQL> alter pluggable database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' online ; Pluggable database altered. SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' offline ; Database altered. SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' online ; alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' online * ERROR at line 1: ORA-01113: file 26 needs media recovery ORA-01110: data file 26: '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' SQL> alter pluggable database pdb1 recover datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' ; Pluggable database altered. SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' online ; Database altered. |
4.5. Tablespace에 Datafile 추가/제거
non-CDB와 완벽하게 동일하다. Tablespace에 Datafile을 추가/제거/하는 작업에 대해서 alter pluggable database 구문은 Syntax 자체가 존재하지 않음.
SQL> alter pluggable database pdb1 tablespace TEST_TBS add datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs02.dbf' size 50M autoextend on ; alter pluggable database pdb1 tablespace TEST_TBS add datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs02.dbf' size 50M autoextend on * ERROR at line 1: ORA-00922: missing or invalid option SQL> alter tablespace TEST_TBS add datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs02.dbf' size 50M autoextend on ; Tablespace altered. SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs02.dbf' offline drop ; Database altered. SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/pdb1/test_tbs01.dbf' resize 100M ; Database altered. |