Tablespace와 Data File 관리

 


Oracle은 필요한 Block를 Disk의 Data File 에서 찾아 메모리로 적재시키는데 이때 적재되는 메모리의 공간이Tablespace이다. 이 Tablespace에서 작업이 끝나면 다시 Data File에 저장한다.

Tablespace는 메모리상에 생성되는 논리적인 공간이고 Datafile은 물리적으로 존재하는 파일이다.
Tablespace에 DataFile이 소속되어 있기 때문에 DataFile의 Block이 읽혀지게되면 메모리로 올라가는데 자신이 속한 Tablespace영역에 적재되어 작업이 수행된다.



Tablespace
 Data File의 Block이 Server Process에 의해 읽혀져서 Instance의 논리적인 tablespace에 저장한다. 하나 이상의 데이터 파일로 구성된다.


Tablespace Type
System tablespace 과 Non-System tablespace 이 존재한다.

1. SYSTEM

SYSTEM
UNDO

SYSTEM Tablespace
- 사용자가 직접 수정할 수 없다. 

- 데이터베이스 생성시 함께 생성된다.
- System tablespace에는 Data Dictionary를 포함한다.
UNDO Tablespace
- DML 수행시 원본 데이터를 저장하는 공간이다.
- 사용자가 생성할 수 있고 관리 할 수있다.
- MUM방식을 사용하던 8i까지는 rollback Segmemt 라는 용어를 사용 했지만 9i부터 AUM 기능이 추가되면서 undo Segmemt 으로 용어가 바뀌었다.


2. Non-System
- 위의 두개를 제외한 나머지
- SYSAUX : 10g에서 추가된 Tablespace이다. 주로 성능 튜닝을 위한 데이터들이 저장되어 있다.


Tablespace 생성

Tablespace 생성

CREATE TABLESPACE name
DATAFILE '생성할 파일의 경로' SIZE 000M
;
UNDO Tablespace 생성
CREATE UNDO TABLESPACE name
DATAFILE '생성할 파일의 경로'  SIZE 000M
;
Temporary Tablespace 생성
CREATE TEMPORARY TABLESPACE name
TEMPFILE '생성할 파일의 경로' SIZE 000M
Default Temporary Tablespace 생성 
ALTER DATABASE
DEFAULT TEMPORARY TABLESPACE 대상TemporaryTablespace이름

TABLESPACE 생성 옵션

AUTOEXTEND
DataFile의 크기를 자동으로 확장되게 하는 옵션이다. 만일 SIZE 1M의 크기를 가진 DataFile이 있는데 데이터가 가득 차면 더이상 데이터를 저장 할 수 없다. 이때 이 옵션을 사용하여 생성했다면 자동으로 DataFile의 크기가 늘어난다.
CREATE TABLESPACE test_tbs
DATAFILE '/home/oracle/oradata/testdb/test01.dbf' SIZE 1M
AUTOEXTEND ON NEXT 1M MAXSIZE 100M;
File의 크기가 1M 가 되면 자동으로 1M씩 늘어나게 되고, 최대크기가 100M까지 늘어난다.

SEGMENT SPACE MANAGEMENT AUTO
이 옵션은 9i에서 등장했는데 특수한 경우가 아니라면 무조건 이 옵션을 사용한다. 30%정도의 성능 향상 되고 이 옵션을 사용해야 ASSM(Auto Segment Space Management http://tawool.tistory.com/193) 가 적용된다. 10g에서는 기본으로 이 옵션이 사용된다.
CREATE TABLESPACE test_tbs
DATAFILE '/home/oracle/oradata/testdb/test01.dbf' SIZE 1M
SEGMENT SPACE MANAGEMENT AUTO;


Tablespace 확장
만약 데이터 파일의 크기를 바꾸고자 한다면 아래의 명령으로 바꿀 수 있다. 바꾼 후에는 Data File 목록 조회
를 통해 바뀐 크기를 조회할 수 있다.
ALTER DATABASE
DATAFILE '/home/oracle/oradata/testdb/test01.dbf' RESIZE 5M;

또는 DataFile을 추가하고자 한다면 이와 같이 한다.
ALTER TABLESPACE test_tbs
ADD DATAFILE '/home/oracle/oradata/testdb/test02.dbf' SIZE 1M;

Tablespace 삭제

삭제명령을 하면 실제 데이터 파일은 삭제가 안되고 Data Dictionary 에서만 제거되기 때문에 아래 옵션을 주면 DataFile까지 삭제가 된다. 또
DROP TABLESPACE test_tbs
INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;



Tablespace의 관리 기법
크게 LMT(Locally managed tablespace)와 DMT(Dictinary managed Tablespace)로 나뉜다.


LMT 



- 각 tablespace에서 비트맵이용하여 확장 영역에 대한 공간을 관리한다. 비트맵의 각 비트는 블록 또는 블록 그룹에 대응됨으로써 상태를 알 수 있다.
- 9i부터 기본으로 사용하는 방식이고 10g에는 DMT 방식을 지원하지 않는다.

DMT


- 각 Tablespace의 Extent에 대한 관리를 DataDictionary 에서 모두 관리를 하는 방식이다. 이 방식은 Tablespace에서 Extent가 할당되거나 해제될 때마다 DataDictionary가 갱신된다.
- DataDictionary로 동시에 많은 요청이 발생하면 성능의 저하가 발생하기 때문에 9i 부터 기본적으로 이 방식은 사용하지 않으며 10g 에서부터는 이 옵션은 사용할 수 없다.

Data File
실제 Disk 에 File(물리적) 로 저장되어 있고 스키마 객체 데이터의 저장소이다.
Data File은 Tablespace 를 생성할 때 Data File을 설정한다. 
이 Data File의 크기는 2Gb를 넘지 않는게 좋다.

Tablespace 상태조회
현재 설정 상태등을 조회 할 수 있는데 STATUS 의 값은 간혹 OFFLINE 상태인데 ONLINE으로 출력된다. 그때는 Data File 목록 조회의 결과중에 bytes 컬럼의 값이 있으면 ONLINE, 없으면 OFFLINE 이다.
SELECT
  tablespace_name
, status
, contents
, extent_management
, segment_space_management 
FROM dba_tablespaces


 





Data File 목록 조회
Data File은 DBA_DATA_FILES 를 조회하면 아래와 같이 출력된다. 여기서 bytes 컬럼에 값이 있으면 ONLINE 이고 값이 없으면 OFFLINE 상태이다.
SELECT
file_name
, file_id
, tablespace_name
, status
, bytes / 1024 / 1024 "MB"
, autoextensible
, maxbytes /1024/1024 "MAX MB"
, maxblocks
FROM
dba_data_files
ORDER BY 2

  


Data File의 이동
Data File의 이동은 두가지 방법이 있다. 하나는 open 상태에서 옮기고 두번째는 mount 상태에서 옮기는 방법이다. 이렇게 두가지 방법이 있는 이유는 system tablespace는 mount 상태에서 옮겨야 하고 non-system tablespace는 open 상태에서도 옮길 수 있기 때문이다.

open 상태에서 non-system tablespace DataFile 이동
SYSTEM이나 UNDO Tablespace는 이 방법을 이용하여 DataFile을 이동하면 안된다.

1. Tablespace offline 처리
2. os 명령어로 실제 파일 이동
3. alter database 명령어로 rename 처리
4. Tablespace online 처리
SQL> ALTER TABLESPACE  test_tbs offline;
SQL> !mv  /home/oracle/oradata/testdb/test01.dbf  /disk1/test01.dbf
SQL> ALTER DATABASE RENAME DATAFILE  '/home/oracle/oradata/testdb/test01.dbf' TO '/disk1/test01.dbf';
SQL> ALTER TABLESPACE test_tbs online;


mount 상태에서 system tablespace의 DataFile 이동
반드시 SYSTEM이나 UNDO Tablespace는 이 방법을 이용하여 DataFile을 이동해야 한다.
1. Database Mount
2. OS 명령어로 실제 파일 이동
3. alter Database 명령어로 rename 처리
4. Database OPEN
 
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> !MV /home/oracle/oradata/testdb/system01.dbf  /disk1/system01.dbf
SQL> ALTER DATABASE RENAME DATAFILE '/home/oracle/oradata/testdb/system01.dbf' TO '/disk1/system01.dbf'
SQL>ALTER DATABASE OPEN;