DATABASE(oracleDB 11g)/DBA

[Oracle DBA]데이터베이스 저장 영역 구조 관리

SEUNGSAMI 2019. 3. 28. 11:14
데이터베이스 저장 영역 구조 관리





Tablespace
  • Data의 성격(세션)을 나눈다.
  • SYSTEM
  • TEMP
  • UNDOTBS
  • USERS
  • Example
  • HR_Data
  • dba_table_spaces
  • dba_datafiles(datadictionary)

Segment
  • 저장공간을 차지하는 객체
  • Table
  • Data
  • Index
  • undo
      • dba_rollback_segs
  • temporary
  • dba_segments
  • segment의 할당된 첫번째 extent : segment header block
      • HWM이 저장된다
      • Free list 가 존재한다.

Extent
  • dba_extents, user_extents


Database Block

  • 테이블에 데이터가 저장되는 방식
      • 행구조
          • rowheader
          • 1col header
          • 1col value
          • 2col header
          • 2col value
          • null
              • null은 col header 정보가 0으로 저장된다.
              • trailing nulls
                  • 행의 뒤쪽에 null로 연속된 공간
                  • 따로 저장을 안하고 바로 다음 헤더가 온다.
                      • 선택적 입력 컬름들은 테이블 설계시 뒤쪽에 배치하는 것을 고려
          • pctfree
              • 해당 블록에 저장된 행에 늘어나는 update를 위해서 예비한 공간의 PCT
              • 10에서 30으로 늘렸을 경우
                  • 장점
                      • row migration 가능성이 줄어든다
                  • 단점
                      • 더 많은 저장공간 필요
                      • 성능이 저하
************row migration 발생유발 => 확인 => 해결************
  1. 테이블생성
  2. insert
  3. update => row migration 유발
  4. analyze table => 확인
  5. 테이블 재구성(reorganization)

SYS@orcl2> conn scott/tiger

SCOTT@orcl2> create table mig_test
             ( a number(10), b varchar2(1000) );
Table created.


SCOTT@orcl2> insert into mig_test
             select level, 'abc' from dual connect by level < 1000;
999 rows created.


SCOTT@orcl2> select tablespace_name, segment_name from user_segments;

       TABLESPACE_NAME               SEGMENT_NAME
----------------------  -------------------------
USERS                    DEPT
USERS                    EMP
USERS                    SALGRADE
USERS                    MIG_TEST
USERS                    PK_DEPT
USERS                    PK_EMP
6 rows selected.


SCOTT@orcl2> select extent_id, bytes/1024 k, blocks
               from user_extents
              where segment_name = 'MIG_TEST';

EXTENT_ID          K     BLOCKS
---------- ---------- ----------
         0         64          8


SCOTT@orcl2>save ext
Created file ext.sql


SCOTT@orcl2> select rowid , a from mig_test;
ROWID                       A
------------------ ----------
AAASNOAAEAAAAILAAA          1
AAASNOAAEAAAAILAAB          2
AAASNOAAEAAAAILAAC          3
...
AAASNOAAEAAAAIMAGt        996
AAASNOAAEAAAAIMAGu        997
AAASNOAAEAAAAIMAGv        998
AAASNOAAEAAAAIMAGw        999

SCOTT@orcl2> insert into mig_test
             select * from mig_test;
999 rows created.

SCOTT@orcl2> /
1998 rows created.

SCOTT@orcl2> /
3996 rows created.

SCOTT@orcl2> commit;
Commit complete.


SCOTT@orcl2> select count(*) from mig_test;
  COUNT(*)
----------
      7992

SCOTT@orcl2> update mig_test
                set b = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
7992 rows updated.


SCOTT@orcl2> commit;
Commit complete.

SCOTT@orcl2> select table_name, blocks, chain_cnt from user_tables
              where table_name='MIG_TEST';

TABLE_NAME                         BLOCKS  CHAIN_CNT
------------------------------ ---------- ----------
MIG_TEST                              244       
-- 현재 통계정보가 없다


SCOTT@orcl2> analyze table mig_test compute statistics;
Table analyzed.
-- 여러 통계정보를 만들어준다.


SCOTT@orcl2> select table_name, blocks, chain_cnt from user_tables
              where table_name='MIG_TEST';

TABLE_NAME                         BLOCKS  CHAIN_CNT
------------------------------ ---------- ----------
MIG_TEST                              244       7793

SCOTT@orcl2> save tab
Created file tab.sql

SCOTT@orcl2> @ext

EXTENT_ID          K     BLOCKS
---------- ---------- ----------
         0         64          8
         1         64          8
         2         64          8
         3         64          8
         4         64          8
         5         64          8
         6         64          8
         7         64          8
         8         64          8
         9         64          8
        10         64          8
        11         64          8
        12         64          8
        13         64          8
        14         64          8
        15         64          8
        16       1024        128

17 rows selected.
-- 17번째는 1M를 할당 받았다.(Auto extent)


SCOTT@orcl2> alter table mig_test move;
Table altered.
-- move는 지금 있는 테이블을 물리적으로 다른테이블을 만들고 이곳에 데이터를 옮기고 원래 있던 테이블을 삭제한다.(현재 약 8000번의 insert가 다시 발생한 것이다.)

SCOTT@orcl2> analyze table mig_test compute statistics;
Table analyzed.


SCOTT@orcl2> @tab
TABLE_NAME                         BLOCKS  CHAIN_CNT
------------------------------ ---------- ----------
MIG_TEST                              172          0



tablespace 생성 및 관리
CREATE TABLESPACE TBS2
DATAFILE '/u01/app/oracle/oradata/PROD/tbs2_1.dbf' SIZE 10M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K
SEGMENT SPACE MANAGEMENT AUTO;
  • smallfile tablespace(default)
      • 최대 1022개 까지 데이터 파일을 정의할 수 있다
  • bigfile tablespace 
      • 10g부터 추가된 기능
      • 한 테이블스페이스에 하나의 데이터파일만 정의할 수 있다.
      • 40억개 block (2k ... 32k) 최대 128TB
  • contents
      • permanent (table, index)
          • 영구히 data를 저장하는 일반적인 테이블 스페이스
      • undo
          • 임시로 data를 저장하는데 사용하는 임시테이블 스페이스, sort나 임시테이블을 저장
      • temporary
          • undo data를 저장하는 테이블 스페이스(rollback을 가능하게 해주는 undo data를 저장하는 테이블 스페이스)
  • extent management 방법
      • local
          • extent 할당 관련 정보를 테이블스페이스의 데이터파일 헤더에 비트맵으로 기록하고 사용하겠다
          • SYSTEM Tablespace의 DataDictionary에는  Free Space정보를 관리하는 정보가 있다. 이것을 읽으려면 시간이 오래걸린다.
          • autoallocate(default)
              • 오라클이 알아서 사이즈를 주겠다라는 뜻
              • 1개의 extent에 만약 10개 블럭을 할당한다면 한번에 8개 블럭을 읽고 1번더 읽어야한다.
              • 5개의 블럭이면 한번에 5개의 블럭을 읽지만 3개의 손해가 나므로 이러한 것들을 자동으로 조절해준다는 것이다.
          • uniform size 1m
              • 아예 사이즈를 uniform(균일)하게(1m) 자른다는 것이다
              • DBA가 이 테이블스페이스에 들어가는 데이터가 작거나 큰것을 이해할때, 테이블스페이스를 설계하기 위해 사용한다.
      • dictionary
          • 현재 거의 쓰이지 않는 방법
  • status
      • online
          • 사용자들이 테이블스페이스내의 세그먼트 데이터를 사용할 수 있는 상태
          • read-write(select & update 가능), (default)
          • read only
      • offline
          • normal(default)
          •  temporary
              • checkpoint 가능한 파일만 하는 것.
          • immediate
              • checkpoint를 안함
  • Storage Type
      • Automatic Segment Space Management(ASSM)
        • segment space management auto(default)
        • segment space management manual
  • Blocksize
      • 2k, 4k, 8k, 16k, 32k
      • 비표준크기 블럭을 가진 테이블스페이스를 생성하기 위해서
          • db_nk_cache_size 파라미터가 먼저 정의되어야 한다.
      • db_block_size = 8k
      • 이놈을 늘리기위해서는 메모리부터 있어야한다.

테이블스페이스 속성
  • online( read write, read only), offline
  • 테스트
  1. 테이블스페이스의 현재 속성 확인
  2. read only 변경 후 테스트
  3. offline 변경 후 테스트
SYS@orcl2> col tablespace_name for a25
SYS@orcl2> select tablespace_name, block_size, status, extent_management, allocation_type,                           segment_space_management, contents
             from dba_tablespaces;

TABLESPACE_NAME           BLOCK_SIZE STATUS    EXTENT_MAN ALLOCATIO SEGMEN CONTENTS
------------------------- ---------- --------- ---------- --------- ------ ---------
SYSTEM                          8192 ONLINE    LOCAL      SYSTEM    MANUAL PERMANENT
SYSAUX                          8192 ONLINE    LOCAL      SYSTEM    AUTO   PERMANENT
UNDOTBS1                        8192 ONLINE    LOCAL      SYSTEM    MANUAL UNDO
TEMP                            8192 ONLINE    LOCAL      UNIFORM   MANUAL TEMPORARY
USERS                           8192 ONLINE    LOCAL      SYSTEM    AUTO   PERMANENT
EXAMPLE                         8192 ONLINE    LOCAL      SYSTEM    AUTO   PERMANENT

6 rows selected.


SYS@orcl2> select owner, segment_name
           from dba_segments
           where tablespace_name = 'USERS';

              OWNER     SEGMENT_NAME
-------------- -------------
SCOTT           DEPT
SCOTT           EMP
SCOTT           SALGRADE
SCOTT           MIG_TEST
SCOTT           PK_DEPT
SCOTT           PK_EMP


SYS@orcl2> select tablespace_name, status
             from dba_tablespaces;  

TABLESPACE_NAME           STATUS
------------------------- ---------
SYSTEM                    ONLINE
SYSAUX                    ONLINE
UNDOTBS1                  ONLINE
TEMP                      ONLINE
USERS                     ONLINE
EXAMPLE                   ONLINE

6 rows selected.


SYS@orcl2> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
     ...
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.


SYS@orcl2> update scott.emp set sal = sal*1;
14 rows updated.


SYS@orcl2> alter tablespace users read only;
Tablespace altered.


SYS@orcl2> select * from scott.emp;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      ...
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.


SYS@orcl2> update scott.emp set sal = sal*1;
update scott.emp set sal = sal*1
             *
ERROR at line 1:
ORA-00372: file 4 cannot be modified at this time
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl2/users01.dbf'

-- 다시 되돌린다.
SYS@orcl2> alter tablespace users read write;
Tablespace altered.


===================================================================================================
SYS@orcl2> alter tablespace users offline;
Tablespace altered.


SYS@orcl2> select * from scott.emp;
select * from scott.emp
*
ERROR at line 1:
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl2/users01.dbf'
-- 파스 자체가 invalid 된다.


SYS@orcl2> alter tablespace users online;
Tablespace altered.


SYS@orcl2> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      ...
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.




Tablespace의 확장
  • add
  • resize
  • autoextend on
    • max size까지 늘어난다.
    • max size를 제한하려면 뒤에 max size를 붙여준다.
  • 테이블스페이스 공간 부족시 해결방법
SYS@orcl2> drop tablespace tbs2 including contents and datafiles;

SYS@orcl2> create tablespace tbs2 datafile '/home/oracle/tbs2_01.dbf' size 5m;
Tablespace created.

SYS@orcl2> create table scott.t1
           tablespace tbs2
           as select * from scott.emp;
Table created.


SYS@orcl2> select * from dba_extents
  2  where segment_name = 'T1';


SYS@orcl2> insert into scott.t1
           select * from scott.t1;
14 rows created.

SYS@orcl2> insert into scott.t1
           select * from scott.t1;
28 rows created.

......

SYS@orcl2> insert into scott.t1
select * from scott.t1;  2
28672 rows created.

SYS@orcl2> insert into scott.t1
           select * from scott.t1;
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.T1 by 128 in tablespace TBS2
-- 에러 발생

SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
           from dba_free_space
           where tablespace_name='TBS2';
no rows selected
-- freespace공간 확인, 없는게 확인 됨.

-- 첫번째 해결방법
SYS@orcl2> alter tablespace tbs2 add datafile '/home/oracle/tbs202.dbf' size 10m;
Tablespace altered.

SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
           from dba_free_space
           where tablespace_name='TBS2';

TABLESPACE_NAME              FILE_ID         MB     BLOCKS
------------------------- ---------- ---------- ----------
TBS2                               8          9       1152

-- 두번째 해결방법
SYS@orcl2> alter database datafile '/home/oracle/tbs2_01.dbf' resize 20m;
Database altered.


SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
           from dba_free_space
           where tablespace_name='TBS2';

TABLESPACE_NAME              FILE_ID         MB     BLOCKS
------------------------- ---------- ---------- ----------
TBS2                               7         15       1920
TBS2                               8          9       1152


-- 세번째 해결방법
SYS@orcl2> alter database datafile '/home/oracle/tbs2_01.dbf' autoextend
on next 10M maxsize 100m;
Database altered.

SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
           from dba_free_space
           where tablespace_name='TBS2';

TABLESPACE_NAME              FILE_ID         MB     BLOCKS
------------------------- ---------- ---------- ----------
TBS2                               7         15       1920
TBS2                               8          9       1152

SYS@orcl2> select file_id, file_name, bytes, autoextensible from dba_data_files;


   FILE_ID FILE_NAME                                                         BYTES AUT
---------- ------------------------------------------------------------ ---------- ---
         4 /u01/app/oracle/oradata/orcl2/users01.dbf                      10485760 YES
         3 /u01/app/oracle/oradata/orcl2/undotbs01.dbf                   110100480 YES
         2 /u01/app/oracle/oradata/orcl2/sysaux01.dbf                    555745280 YES
         1 /u01/app/oracle/oradata/orcl2/system01.dbf                    713031680 YES
         5 /u01/app/oracle/oradata/orcl2/example01.dbf                   104857600 YES
         6 /home/oracle/test/ORCL2/datafile/o1_mf_tbs1_g9rx659z_.dbf     104857600 YES
         7 /home/oracle/tbs2_01.dbf                                       20971520 YES
         8 /home/oracle/tbs202.dbf                                        10485760 NO
8 rows selected.

     FILE# NAME                                                              BYTES
---------- ------------------------------------------------------------ ----------
         1 /u01/app/oracle/oradata/orcl2/system01.dbf                    713031680
         2 /u01/app/oracle/oradata/orcl2/sysaux01.dbf                    555745280
         3 /u01/app/oracle/oradata/orcl2/undotbs01.dbf                   110100480
         4 /u01/app/oracle/oradata/orcl2/users01.dbf                      10485760
         5 /u01/app/oracle/oradata/orcl2/example01.dbf                   104857600
         6 /home/oracle/test/ORCL2/datafile/o1_mf_tbs1_g9rx659z_.dbf     104857600
         7 /home/oracle/tbs2_01.dbf                                       20971520
         8 /home/oracle/tbs202.dbf                                        10485760


8 rows selected.
-- 위의 해결방법중 경로는 FILE_ID(FILE#)로 대체가 가능하다.


SYS@orcl2> insert into scott.t1
           select * from scott.t1;
57344 rows created.
-- 정상적으로 삽입 된다.


SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
           from dba_free_space
           where tablespace_name='TBS2';

TABLESPACE_NAME              FILE_ID         MB     BLOCKS
------------------------- ---------- ---------- ----------
TBS2                               7         14       1792
TBS2                               8          8       1024
-- 남은 freespace확인.



테이블 스페이스의 종류
SYS@orcl2> select tablespace_name, contents
  2  from dba_tablespaces;


TABLESPACE_NAME           CONTENTS
------------------------- ---------
SYSTEM                    PERMANENT
SYSAUX                    PERMANENT
UNDOTBS1                  UNDO
TEMP                      TEMPORARY
USERS                     PERMANENT
EXAMPLE                   PERMANENT
TBS1                      PERMANENT
TBS2                      PERMANENT
  • permanent (table, index)
      • 영구히 data를 저장하는 일반적인 테이블 스페이스
  • undo
      • 임시로 data를 저장하는데 사용하는 임시테이블 스페이스, sort나 임시테이블을 저장
  • temporary
      • undo data를 저장하는 테이블 스페이스(rollback을 가능하게 해주는 undo data를 저장하는 테이블 스페이스)
      • group
          • group을 만드는 이유는 I/O가 분산되며 임시데이터에 의한 공간 부족 및 경합을 줄일 수 있다.
SYS@orcl2> create temporary tablespace temp1
           tempfile '/home/oracle/temp1.dbf' size 10m autoextend on
           tablespace group temp_grp;
Tablespace created.

SYS@orcl2> create temporary tablespace temp2
           tempfile '/home/oracle/temp2.dbf' size 10m autoextend on
           tablespace group temp_grp;
Tablespace created.


SYS@orcl2> select tablespace_name, status, contents, logging, segment_space_management, bigfile
           from dba_tablespaces;

TABLESPACE_NAME           STATUS    CONTENTS  LOGGING   SEGMEN BIG
------------------------- --------- --------- --------- ------ ---
SYSTEM                    ONLINE    PERMANENT LOGGING   MANUAL NO
SYSAUX                    ONLINE    PERMANENT LOGGING   AUTO   NO
UNDOTBS1                  ONLINE    UNDO      LOGGING   MANUAL NO
TEMP                      ONLINE    TEMPORARY NOLOGGING MANUAL NO
USERS                     ONLINE    PERMANENT LOGGING   AUTO   NO
EXAMPLE                   ONLINE    PERMANENT NOLOGGING AUTO   NO
TBS1                      ONLINE    PERMANENT LOGGING   AUTO   NO
TBS2                      ONLINE    PERMANENT LOGGING   AUTO   NO
TEMP1                     ONLINE    TEMPORARY NOLOGGING MANUAL NO
TEMP2                     ONLINE    TEMPORARY NOLOGGING MANUAL NO

10 rows selected.

SYS@orcl2> select file_id, file_name, tablespace_name, bytes/1024/1024 as mb,
           blocks, autoextensible, increment_by, trunc(maxbytes/1024/1024) as max_gb
           from dba_data_files;
-- TEMP파일은 DATAFILE이 아니므로 조회되지 않는다.



테이블스페이스의 삭제
SYS@orcl2> select 'drop tablespace '||tablespace_name||' including contents and datafiles;'
from dba_tablespaces
where tablespace_name not in
    ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP', 'USERS', 'EXAMPLE');

'DROPTABLESPACE'||TABLESPACE_NAME||'INCLUDINGCONTENTSANDDATAFILES;'
--------------------------------------------------------------------------------
drop tablespace TBS1 including contents and datafiles;
drop tablespace TBS2 including contents and datafiles;
drop tablespace TEMP1 including contents and datafiles;
drop tablespace TEMP2 including contents and datafiles;

SYS@orcl2> save drop_list
Created file drop_list.sql

SYS@orcl2>ed drop_list

spool drop.sql
set echo off
set head off
set pages 0
set feed off
select 'drop tablespace '||tablespace_name||' including contents and datafiles;'
from dba_tablespaces
where tablespace_name not in
    ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP', 'USERS', 'EXAMPLE')
set echo on
set feed on
set head on
set pages 100
spool off
/
~
~


SYS@orcl2> @drop_list
Tablespace dropped.
Tablespace dropped.
Tablespace dropped.

-- 이 명령어는 주의해서 사용하도록 하자. 중요한 테이블스페이스가 날라갈 수 있다,




OMF(Oracle Managed File)
  • tablespace를 생성시 OMF가 활성화 되었다면 datafile을 datafile이 만들어지는 default 위치에 기본 크기로 오라클이 알아서 만드는 방식
      • create tablespace tbs1;
          • 파라미터 db_create_file_dest 위치에 datafile의 위치는 서버가 알아서 만들고 사
          • 사이즈는 100m로 만든다. 바꾸고 싶다면 명령어에 써주면 된다.
      • ASM 환경에서 유용하다.
SYS@orcl2> alter system set db_create_file_dest = '/home/oracle/test';
System altered.

만들어라 명령을 하면 이 아래에 만든다.

SYS@orcl2> create tablespace tbs1;
Tablespace created.

SYS@orcl2> select * from dba_data_files
            where tablespace_name = 'TBS1';
-- 위 명령어를 실행한뒤 확인 해보자.


SYS@orcl2> create tablespace tbs2 datafile size 10m;
Tablespace created.
-- datafile_size를 수동으로 정한다.
-- 이처럼 기본값에서 수정사항이 있다면 그냥 명령어에 포함시키면 된다.




<<<<복습>>>>

1. tablespace 생성한 후 테이블스페이스에 대한 정보 확인 하세요.

  tablespace 이름     : app_tbs
  datafile 위치 및 이름 : /home/oracle/app_tbs01.dbf
  datafile 사이즈     : 5m
  extent 관리    : local uniform size 1m
  segment space management: auto
SYS@orcl2> CREATE TABLESPACE app_tbs
           DATAFILE '/home/oracle/app_tbs01.dbf' SIZE 5M
           EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1024K
           SEGMENT SPACE MANAGEMENT AUTO;

Tablespace created.

SYS@orcl2> select tablespace_name, block_size, status, extent_management,                                           allocation_type, segment_space_management, contents
           from dba_tablespaces
           where tablespace_name = 'APP_TBS';

TABLESPACE_NAME           BLOCK_SIZE STATUS    EXTENT_MAN ALLOCATIO SEGMEN CONTENTS
------------------------- ---------- --------- ---------- --------- ------ ---------
APP_TBS                         8192 ONLINE    LOCAL      UNIFORM   AUTO   PERMANENT




2. app_tbs 테이블스페이스에 hr.employees을 이용하여 hr.app_emp 테이블 생성하고
테이블이 어느 테이블스페이스에 있는지 조회하고 스토리지 관련 정보를 확인하시오.
HR@orcl2> create table app_emp
          tablespace APP_TBS
          as select * from employees;
Table created.

HR@orcl2> select * from dba_extents
          where segment_name='APP_EMP';

OWNER  SEGMENT_NAME  PARTITION_NAME  SEGMENT_TYPE  TABLESPACE_NAME  EXTENT_ID  BYTES     
-----   ------------- --------------- ------------  ---------------- ---------  --------  
HR      APP_EMP                        TABLE         APP_TBS         0          1048576    
-- HR 계정에서 직접 하는법

===================================================================================================

SYS@orcl2> create table hr.app_emp
           tablespace APP_TBS
           as select * from hr.employees;
Table created.

SYS@orcl2> select * from dba_extents
          where segment_name='APP_EMP';

SEGMENT_NAME  PARTITION_NAME  SEGMENT_TYPE  TABLESPACE_NAME  EXTENT_ID  BYTES     BLOCKS
------------- --------------- ------------  ---------------- ---------  --------  ------
APP_EMP                        TABLE         APP_TBS         0          1048576    128
-- SYSDBA계정으로 하는법




3. app_tbs 테이블스페이스를 read only 로 설정하시오.
SYS@orcl2> alter tablespace app_tbs read only;
Tablespace altered.

SYS@orcl2> select file#, status, enabled from v$datafile;
     FILE# STATUS  ENABLED
---------- ------- ----------
         1 SYSTEM  READ WRITE
         2 ONLINE  READ WRITE
         3 ONLINE  READ WRITE
         4 ONLINE  READ WRITE
         5 ONLINE  READ WRITE
         6 ONLINE  READ WRITE
         7 ONLINE  READ WRITE
         8 ONLINE  READ ONLY
8 rows selected.

SYS@orcl2> select * from v$tablespace;

       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         2 UNDOTBS1                       YES NO  YES
         4 USERS                          YES NO  YES
         3 TEMP                           NO  NO  YES
         6 EXAMPLE                        YES NO  YES
         7 TBS1                           YES NO  YES
         8 TBS2                           YES NO  YES
         9 APP_TBS                        YES NO  YES
9 rows selected.

SYS@orcl2> select t.ts#, t.name talbespace_name, file#, t.name, status, enabled
           from v$datafile f, v$tablespace t
           where f.ts#=t.ts#;

       TS# TALBESPACE_NAME                     FILE# NAME                 STATUS  ENABLED
---------- ------------------------------ ---------- -------------------- ------- ----------
         0 SYSTEM                                  1 SYSTEM               SYSTEM  READ WRITE
         1 SYSAUX                                  2 SYSAUX               ONLINE  READ WRITE
         2 UNDOTBS1                                3 UNDOTBS1             ONLINE  READ WRITE
         4 USERS                                   4 USERS                ONLINE  READ WRITE
         6 EXAMPLE                                 5 EXAMPLE              ONLINE  READ WRITE
         7 TBS1                                    6 TBS1                 ONLINE  READ WRITE
         8 TBS2                                    7 TBS2                 ONLINE  READ WRITE
         9 APP_TBS                                 8 APP_TBS              ONLINE  READ ONLY

8 rows selected.


4. 3번의 테이블 스페이스에 다음 작업의 결과는 어떠한지 테스트 하고 설명하시오.
1) select count(*) from hr.app_emp;
SYS@orcl2> select count(*) from hr.app_emp;

  COUNT(*)
----------
       107

   
 2) delete from hr.app_emp;
SYS@orcl2> delete from hr.app_emp;
delete from hr.app_emp
               *
ERROR at line 1:
ORA-00372: file 8 cannot be modified at this time
ORA-01110: data file 8: '/home/oracle/app_tbs01.dbf'
  • 데이터에 대한 변경은 불가하다.
    
3) create table hr.app_dept
          tablespace app_tbs
         as select * from hr.departments;
SYS@orcl2> create table hr.app_dept
          tablespace app_tbs
         as select * from hr.departments;  2    3
         as select * from hr.departments
                             *
ERROR at line 3:
ORA-01647: tablespace 'APP_TBS' is read-only, cannot allocate space in it
  • 데이터에 대한 변경은 불가하다.
  • 파일에 속한 데이터파일을 변경하려는 것인데 불가하다.

 4) alter table hr.app_emp modify last_name varchar2(30);
SYS@orcl2> alter table hr.app_emp modify last_name varchar2(30);

Table altered.
  • alter table은 DD에서 col의 데이터 타입을 바꾸거나 늘리거나 하는 일이기 때문에 app_tbs에 접근할 필요가 없으므로 가능하다.
    
5) truncate table hr.app_emp;
SYS@orcl2> truncate table hr.app_emp;
truncate table hr.app_emp
                  *
ERROR at line 1:
ORA-00372: file 8 cannot be modified at this time
ORA-01110: data file 8: '/home/oracle/app_tbs01.dbf'
  • DD에서 작업하고 app_tbs에 할당된것을 해제해야 하기 때문에 불가하다.

6)drop table hr.app_emp purge;
SYS@orcl2> drop table hr.app_emp purge;

Table dropped.
  • DD의 TABLE 정보와 COL의 정보를 삭제하고 스토리지에 할당된 정보가 있으면 그것도 삭제한다.
  • app_tbs는 DD의 기준으로 데이터를 읽는 것이기 때문에, 테이블에 대한 정의가 없기때문에 app_tbs와의 연결이 끊어지는 것이다.
  • drop column의 경우 DD에 대한 변경과 Data Block에 대한 변경이 이루어진다.(불가)

DDL
  • 오라클 서버가 Data Dictionary를 변경한다
  • drop column의 경우 DD에 대한 변경과 Data Block에 대한 변경이 이루어진다.


5. 테스트한 테이블스페이스를 모두 삭제하시오.
drop tablespace app_tbs including contents and datafiles cascade constraints;
-- tablespace 내의 데이터와 OS상의 datafiles를 함께 삭제하라는 뜻
-- 제약조건이 걸려있는 경우 참조하고 있는 제약조건을 삭제(cascade constraints)