이 블로그 검색

[ORACLE] Multitenant 관리 1. (PDB 생성 및 삭제 / Datafile 및 Tablespace 관리)

  

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.

 

 

 

 

 


추천 게시글

[ORACLE] Data Pump가 느리거나 멈춘경우.

목록