Oracle/Admin

2012.01.18 Admin 5일차(Tablespaces and Datafiles) ; 용어설명, DMT, LMT, temporary tablespace, offline, online, resizing, datafile moving, drop tablespace, tablespace관련 명령어들

에몽이ㅋ 2012. 1. 18. 21:53

Tablespaces


1) 용어설명( tablespace? , datafile? )

백화점에 여러 매장(굳찌, 얼마니?, 등등) 이 있고 각 매장마다 창고가 있다.

여기서 매장은 Tablespace
매장의 창고는 Datafile이다. 
 

* Tablespace는 여러개의 Datafile을 가질 수 있고,
여러개의 datafile을 가질때에는 자료를 기록할 때 병렬적으로 (RAID 0과 비슷한 원리) 기록한다.

 

즉, 광대하고 광활한 DB Cache를 여러장소로 나눠놓은 것이 Tablespace라고 할 수 있다.(logical space)
(HDD Partition개념과 비슷)
그리고 Tablespace의 자료를 물리적으로 저장하는 공간이 Datafile(physical space)이다.


*Tablespace에는 Table들이 들어가 있다.

2) 2가지의 Tablespace의 Datafile관리 
한 매장에 손님이 와서 "지갑 주세요~" 라고 했을 때, 일단 매장에서 찾아보고 없으면 창고에 가서 가져오게 되는데, 만약 창고에 무엇이 어디 있는지 써놓지 않았다면 창고 전체를 뒤져봐야한다. 이것을 방지하기 위해 목록을 만들어 놓고, 어떤 물건을 찾을때 바로바로 찾게 된다.

오라클에 적용해보자.
창고의 목록에 해당하는 것과 비슷하게, 자료를 넣거나, 지우거나, 변경할 때 어떤 block이 비어있고, 어떤 block에 자료가 있고를 목록이 없으면 일일이 찾아야 하므로 Block정보목록을 만들어놓는다.

8i이전(8i포함) 까지는 Tablespace를 만들게 되면 기본설정으로 block 정보목록을 dictionary에 모두 일괄적으로(모든 tablespace의 모든 datafile의 block info목록) 저장해놓고, datafile에서 자료를 찾을 때, 항상 dictionary를 참고한다.
위의 방법을 DMT ( Dictionary-Managed Tablespace )방식이라고 한다.
 
DMT 방식의 단점 : 사용자가 몰린다고 생각하면, 모든 사용자가 Dictionary를 참고해야 하므로, 사용자들은 다른 사용자들이 dictionary에서 datafile의 block정보목록을 찾을 때 까지 기다려야 한다. 

이 상황때문에 개선할 필요성을 느껴서 개선한 방법

LMT ( Locally Managed Tablespace ) 이다.
   ; 각 Tablespace에서 각각 자신의 datafile의 block 정보목록을 관리 (9i부터의 기본방법)

DMT tablespace를 만드는 법
CREATE TABLESPACE userdata
DATAFILE '/data/disk1/userdata01.dbf' SIZE 500M
EXTENT MANAGEMENT DICTIONARY DEFAULT STORAGE
(11g 부터는 DMT tablespace라는 개념자체가 없이 무조건 LMT로 만들어진다)

LMT tablespace 만드는 법
CREATE TABLESPACE userdata
DATAFILE '/data/disk1/userdata01.dbf' size 500M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K
(9i 이후로는 Default가 LMT tablespace이므로 EXTENT.... 부분은 안 써도 된다.)

3) Tablespace의 종류 

SYSTEM tablespace : data dictionary, undo segment가 있는 tablespace (그러므로 수정, 삭제 불가능)

non-SYSTEM tablespace : 건드릴 수 있는 tablespace(일반 데이터 tablespace, temporary tablespace 등등)


Undo Tablespace : undo segment를 저장하는 tablespace (홍길동 ---> 일지매로 update한다고 하면, 홍길동이 undo segment에 저장됨)
만드는 법
CREATE UNDO TABLESPACE undo1
DATAFILE '/data/disk1/undo01.dbf' SIZE 40M;


Temporary Tablespace : 데이터를 저장하기 위함이 아닌 다른 작업(ex. 정렬 등등), 즉 SQL문의 완전한 실행을 위해 임시 작업 영역이 필요할 때 사용하는 메모리 공간
     (Temporary Tablespace사용예, 만약에 100만건을 저장할 용량이 없으면 실행을 끝마치지 못하고 멈춘다.)


만드는 법
CREATE TEMPORARY TABLESPACE temp
TEMPFILE '/data/temp/tmp01.dbf' size 500M;
단점 : Temporary tablespace는 여러 Data tablespace들이 공유할 수 있긴 한데, 동시에 사용하지는 못한다.

그래서 거의 Data : Temp tablespace의 개수비율이 1:1이 되게 설정하는 것이 이상적이고,
                                     (data tablespace당 하나의 temp tablespace)

만약에 Data tablespace를 생성할때 Temp tablespace를 따로 지정해주지 않으면 Default Temporary tablespace를 사용하게 된다.

그러므로 Default Temporary tablespace는 항상, 무조건 1개가 존재한다(10g이상에서는 default temp tablespace도 그룹화해서 여러개 사용)

Read Only Tablespaces : select, drop만 가능한 tablespaces
ALTER TABLESPACE userdata READ ONLY;

   ---->  다시 정상적인 상태로 돌리려면  ALTER TABLESPACE userdate READ WRITE;


4) Tablespace Offline 
   ; 해당 tablespace만 shutdown 한다는 의미
 * Offline안되는 tablespace 3가지 : SYSTEM tablespace, undo tablespace, Default temporary tablespace

 Offline하는 법
ALTER TABLESPACE userdate OFFLINE;    ---> online  --->  ALTER TABLESPACE userdate ONLINE;

5) Tablespace Resizing
Tablespace의 datafile이 용량이 적다면 기록하지 못하고 에러가 난다. 이럴때에는 해당 datafile을 추가시키거나, 파일을 늘리거나, 늘릴수 있게 해줘야 한다.

   1) Datafile size변경
      첫번째, AUTOEXTEND 로 파일이 자동으로 늘어나게 하는 방법(자동)
      두번째, ALTER database로 파일의 용량을 늘리는 방법(수동)

   2) Datafile 추가
      ALTER TABLESPACE 이용

Datafile size변경 중 AUTOEXTEND 활성화 하는 방법
1. 생성과 동시에 AUTOEXTEND 활성화

CREATE TABLESPACE user_data
DATAFILE '/data/userdata01.dbf' SIZE 200M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
(200M 초과 시 10M씩 늘려서 500M까지 늘리겠다.)

2. 만들어져 있는 tablespace에 AUTOEXTEND 활성화
ALTER DATABASE
DATAFILE '/data/userdata01.dbf'
AUTOEXTEND ON;
Datafile size변경 중 수동으로 파일의 용량을 늘려주는 방법
ALTER DATABASE
DATAFILE '/data/userdata01.dbf'
RESIZE 500M;
Datafile 추가하는 방법
ALTER TABLESPACE user_data
ADD DATAFILE '/data/userdata02.dbf'
SIZE 300M;


6) Datafiles Moving
또 필요에 따라 datafile을 이동해야 할 떄가 있다.(관리나 복구 등등)
순서(순서에 맞지 않게 작업하면 DB가 손상됩니다.)
1. 해당파일 사용안하게 만들기(offline, shutdown해서 mount단계에서 작업)
      shutdown을 쓰는 경우는 파일 중에 system, undo tablespace의 datafile이 포함될때

2. OS명령어로 copy or move ( 안전상 copy를 사용 )

3. 위치정보 변경(control file설정)
ALTER TABLESPACE userdata RENAME
DATAFILE '/data/userdata01.dbf'
TO '/disk1/userdata01.dbf';
아니면
ALTER DATABASE RENAME
FILE '/data/userdate01.dbf'
  TO '/disk1/userdate01.dbf';        <------ 이 방법을 많이 사용합니다.

4. 사용하게 설정하기

*redo log파일도 3번방법으로 파일변경이 가능합니다. 


6) Dropping Tablespaces (지울떄는 항상 조심에 조심!!)
DROP TABLESPACE userdata
INCLUDING CONTENTS    <---- tablespace 지움(해당 datafile은 disk에 남아있음)

DROP TABLESPACE userdata
INCLUDING CONTENTS AND DATAFILES  <---- tablespace, datafile 다 삭제




부록 : Tablespace관련 명령어 정리

* Data file 및 tablespace관련 조회
select tablespace_name, status, contents,
extent_management, segment_space_management
from dba_tablespaces;
----------------------------------------------
select tablespace_name, bytes/1024/1024 mb, file_name from dba_data_files; 

* Tablespace 생성
create tablespace 테이블스페이스이름
datafile '데이터파일이름' size ??M
segment space management auto; <---9i이하버전 필수, 10g이후는 default(안써도됨)
----------------------------------
create tablespace 테이블스페이스이름
datafile '데이터파일이름' size ??M
extent management local;
----------------------------------
create undo tablespace 테이블스페이스이름
datafile '데이터파일이름' size ??M;
----------------------------------
create temporary tablespace 테이블스페이스이름
datafile '데이터파일이름' size ??M;
----------------------------------
create tablespace 테이블스페이스이름
datafile '데이터파일이름' size ??M
blocksize ??
segment space management auto; 

* Tablespace 확장
alter tablespace 테이블스페이스이름
add datafile 'datafile이름' size ??M;
----------------------------------
alter database datafile
'데이터파일이름' resize ??M; 

* Tablespace 관리
alter tablespace 테이블스페이스이름 offline;
----------------------------------
alter tablespace 테이블스페이스이름 online;
----------------------------------
alter tablespace 테이블스페이스이름 rename
datafile '원본데이터파일이름'
to '데이터파일이름' 
----------------------------------
alter database rename
file '원본데이터파일이름'
to '데이터파일이름'

*Tablespace 삭제
drop tablespace 테이블스페이스이름
including contents and datafiles cascade constraints;