Oracle Sqlplus – 2. TABLE SPACES

Oracle Sqlplus – 2. TABLE SPACES에 대해 알아 보겠습니다.

2. TABLE SPACES

TABLE은 아래의 그림과 같이 2차원의 형태로 구성되며 한 개의 열(ROW, RECORD)는 각각의 ATTRIBUTE(FIELD, ITEM)으로 구성되며 각 ATTRIBUTE의 모임을 TUPLE이라고한다.

ATTRIBUTE의 속성은 다음과 같다.

TYPE의 미
INTEGER정수형
NUMBER일반숫자
DECIMAL고정소수
FLOAT부동소수
CHAR문자
VARCHAR문자열
VARCHAR2문자열
LONG2GB지원
DATE날짜형

2-1. TABLE의 구성

각 테이블의 구성체를 DOMAIN이라 하며 TABLESPACE는 DOMAIN으로 구성되어 있다.

2-2. DATABASE상태

(1) 현재 DB내의 가용공간을 확인한다.

select * from dba_data_files;

.TABLESPACE_NAME : TABLESPACE명

.FILE_ID : TABLESPACE의 물리적인 위치 ADDRESS

.BLOCK_ID : TABLESPACE의 물리적인 위치 ADDRESS

.BYTES : 각 TABLESPACE가 차지하고 있는 크기

.BLOCKS : 각 TABLESPACE가 차지하고 있는 크기로 1BLOCK=2048BYTE

(2) 현재DB를 구성하고 있는 파일들을 확인한다.

SQL> select * 2 from dba_tablespaces;

.FILE_NAME : Tablespace가 위치하고 있는 Directory

.FILE_ID : Tablespace의 데이터파일의 생성순서

.TABLESPACE_NAME : 각 테이블이 위치할 SPACE

.BYTES : Tablespace의 size

.BLOCKS : Tablespace의 size로 1 block은 2048byte

.STATUS : 각 데이터파일의 동작 상태를 나타낸다.

(3) tablespace의 이름과 storage parameter값들을 확인한다.

select * from dba_tablespaces;

.TABLESPACE_NAME : Tablespace명

.INITIAL_EXTENT : 초기 EXTENT의 값으로 BYTE로 나타난다.

.NEXT_EXTENT : 다음에 일어날 EXTENT의 값으로 BYTE단위로 나타낸다.

.MIN_EXTENTS : 초기 EXTENT값으로 DEFAULT는 1이다.

.MAX_EXTENTS : 최대 EXTENT를 일으킬 값으로 DEFAULT는 121이다.

.PCT_INCREASE : NEXT_EXTENT의 비율

.STATUS : TABLESPACE의 상태로 ONLINE/OFFLINE로 표시된다.

2-3. tablespace의 생성

(1) TABLESPACE의 생성

SQL>create tablespace business
2* datafile’\BUSINESS01.dbf’ size 10k;
테이블 영역이 생성되었습니다.

create tablespace business : business는 tablespace명

datafile’\BUSINESS01.dbf’ size 10k : size가 10KB인 datafile의 path와 datafile의 명칭

size가 10KB인 BUSINESS라는 명칭의 TABLESPACE가 생성된 것을 확인할 수 있다.

SQL> select * from dba_tablespaces;

BUSINESS TABLESPACE에 dul1이라는 table을 생성하려한다. 만약 BUSINESS TABLESPACE에 10KB를 초과하는 TABLE을 생성하려 한다면 TABLE은 생성되지 않는다. 이유는 Tablespace가 10KB로 설정되어있기 때문이다. 때문에 TABLE의 SIZE는 TABLESPACE를 초과할 수 없다는 것을 알수 있다.

[예] 정상적인 TABLE의 생성

initial size가 5KB인 dul1이라는 명칭의 tablespace가 생성되었다.

SQL> create table dul1
2 (idno number(8),
3 snamek char(10),
4 addr char(60))
5 tablespace business 6 storage(initial 5k);
테이블이 생성되었습니다.

[예] 생성된 TABLE 학인

SQL> select * from tab;
TNAME TABTYPE CLUSTERID
—————————— ——- ———
DUL1 TABLE

2-4. TABLESPACE의 확장

scott/tiger의 table중 emp table에 있는 내용을 dul1에 insert한다. DUL1은 5KB의 SIZE를 갖고 있으며 5KB까지는 INSERT작업을 계속 수행할 수 있다. 만약 INSERT시키는 양이 5KB를 초과하더라도 TABLESPACE SIZE범위에서 TABLE의 SIZE를 계속 확장(EXTENT)시키며 INSER작업이 가능하게 된다.

SQL>insert into dul1
2* select empno, ename, null
3* from SCOTT.empSQL>
/(17회반복수행)
14 개의 행이 작성되었습니다.

그러나 아래와 같이 17회 반복 수행을 하면 최종적으로 에러가 발생하게 되는데 이는 TABLESPACE의 SIZE를 초과하기 때문이다.

SQL> /insert into dul1
*
라인 1 에 오류:ORA-01653:
테이블 SCOTT.DUL1를 5에 의해 BUSINESS 테이블 공간에서 확장할 수 없습니다

next extent를 할당할 수 없는 dul1 table의 상태를 확인한다.

SQL> select bytes, blocks,extents, initial_extent,next_extent 2 from user_segments 3* where segment_name=’DUL1′;

BYTES : 현재 TABLE DUL1의 SPACE(DEFAULT임)

BLOCK : 8192/2048 =4로 1BLOCK은 20487 BYTE임

EXTENTS : EXTENT를 일으킨 횟수로 표시된 수치만큼 EXTENT를 수행했음을 알수 있다.

INITIAL_EXTENT : EXTENT를 일으킬때의 SPACE로 초기 5,120B보다 1KB큰 6,144B부터 EXTENT를 일으킨다.

NEXT_EXTENT : 다음에 일어날 EXTENT SPACE로 따로 지정치 않을 경우 10KB씩 일어난다.

초기 5KB로 설정된 SPACE의 확장은 6KB를 기준으로 50%씩 EXTENT가 이루어진다. 초기 5,120B로 설정된 DUL1은 EXTENT를 일으킬때는 6,144B/2=3,072B를 EXTENT한다. 1회 EXTENT후 SPACE는 5,120+3,072=8,192B가 된다. 2회 EXTENT시에는 8,192/2=4,096B를 EXTENT하여야 하는데 BUSSINESS TABLESPACE의 전체 SPACE는 10KB(10240B)이기 때문에 8,192+4,096=12,288B(12KB)를 수용할 수 없으므로 EXTENT를 할수 없는 것이다.

[보기] EXTENT시 SPACE

초기 SPACENEXT EXTENTEXTENT후 SPACE
1차 EXTENT5,120B(6,144/2)=3,072B5,120+3,072=8,192
2차 EXTENT8,192B(8,192B/2)=4096B8,192+4,096=12,288

그러면 늘어나는 TABLE의 SIZE를 어떻게 조절할 수 있는가? 간단히 tablespace에 data file을 추가하여 next entent를 일으킬 수 있도록 하는 것으로 해결할 수 있다. 물론 DISK에는 확장할만큼의 여유 SPACE가 있어야 한다.

[예] DATAFILE을 확장한다.

SQL>alter tablespace business 2* add datafile ‘\BUSINESS02.dbf‘ size 5k;
SQL>select * from dba_data_files;
SQL>select bytes, blocks,extents, initial_extent,next_extent 2 from user_segments 3* where segment_name=’DUL1′

2-5. TABLESPACE의 DROP

TABLESPACE를 DROP시킬 경우 TABLESPACE내의 모든 TABLE도 함께 DROP된다. 그러므로 TABLESPACE를 DROP시킬 경우 TABLE을 EXPORT시켜 놓아한다. tablespace를 삭제시 scott/tiger에서는 tablespace를 삭제할 권한이 없으므로 에러가 발생하므로 system/manager로 connect하여 tablespace를 drop시킨다.

SQL> drop tablespace business;
drop tablespace business
*
라인 1 에 오류:ORA-01031: 권한이 불충분합니다

TABLESPACE를 DROP시 tablespace내에 이미 table이 존재할 경우 에러가 발생된다.

SQL> connect system/manager;
연결되었습니다.
SQL> drop tablespace business;
*
라인 1 에 오류:ORA-01549: 테이블 영역이 비어있지 않으므로 INCLUDING CONTENTS를 사용해 주십시오.

tablespace를 drop시킬 때 이미 tablespace에 table이 존재한다면 존재하는 table을 drop시킨 후 tablespace를 drop시켜야 한다. 그러나 많은 table이 tablespace에 존재한다면 일일이 drop시키는것도 무리일 것이다. 이때는 ‘including contents’ statement를 사용하여 해결할 수 있다.

SQL> drop tablespace business including contents;
테이블 영역이 삭제되었습니다.

data file을 확인해보면 BUSINESS TABLESPACE가 DROP된 것을 알 수 있다.

SQL> select * from dba_data_files;

BUSINESS TABLESPACE가 DROP된 것을 확인할 수 있다.

SQL> select * from dba_tablespaces;


이상 “Oracle Sqlplus – 2. TABLE SPACES에 대해 알아 보겠습니다.”에 대해 알아보았습니다.


게시됨

카테고리

작성자

태그:

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다