본문 바로가기

데이터베이스(DA, AA, TA)/Oracle

[오라클] 테이블스페이스와 데이터파일

* 테이블스페이스: 논리적(메모리)
- 오라클 데이터베이스는 하나 이상의 논리적 저장영역 테이블스페이스가 있고 데이터를 집합적으로 저장합니다.
- 하나 이상의 데이터 파일로 구성되어 있습니다.


1. 테이블 스페이스 유형


1.1. 시스템 테이블스페이스(사용자가 건드릴수 없다)
  - 데이터 베이스와 함께 생성됩니다.
  - 데이터 딕셔너리 포함
  - 시스템 Undo Segment를 포함합니다.

1.2. 비시스템 테이블스페이스(사용자가 필요하면 만들고, 지우면서 사용가능)
- 데이터베이스 관리와 공간 관리를 용이하게 할 수 있습니다.
- Undo Segment, Temporary Segment, 응용 프로그램 데이터 세그먼트 및 인덱스 세그먼트를 분할합니다.
- 사용자에게 할당된 공간의 양을 제어합니다.



2. 테이블스페이스 생성(기본)



SQL> CREATE TABLESPACE <테이블스페이스명>
    DATAFILE '<데이터 파일명>' SIZE <크기>    // 생성하는 파일은 크기에 따른 빈파일이 생성
    AUTOEXTEND ON NEXT 5M MAXSIZE 200M;       // 5M씩 최대 200M까지 자동 증가 200M가 다차면 에러발생
                             MAX SIZE가 없으면 32비트:16기가, 64비트:32기가까지 가능



3. 테이블 스페이스 영역관리


테이블스페이스는 확장영역에 공간을 할당합니다.


3.1. DMT(Dictionary Managed Tablespace): 10g부터는 DMT사용안함.
- 데이터 딕셔너리에서 사용 가능한 확장 영역을 관리. 서버 프로레스가 빈 블록을 찾을때 사용중인 곳과 빈 곳을 리스트로 작성 관리(Uetf, Fetf)하는 데이터 딕셔너리 관리합니다.
- 확장 영역이 할당될시 할당해제시 해당 테이블이 갱신됩니다.
- 개인별로 하나씩은 가능하지만 단번에 벌크로 들어오면 데이터가 선형대기상태로 전환돼 처리가 느립니다.

3.2. LMT(Locally Managed Tablespace): 오라클 9i부터 기본설정되서 안써줘도 됨.
- 많은 데이터가 한꺼번에 들어오는 문제를 해결하기 위해 지역적으로 관리되는 테이블스페이스가 기본 관리 방식으로 추가합니다.
- 자체 Extent에 대한 관리를 각각의 데이터 파일에 비트맵 형식으로 저장하여 관리하는 테이블스페이스입니다.
- 데이터파일을 구성하는 블럭이 비었는지, 사용중인지에 대한 정보를 관리합니다.
- 테이블스페이스 할당량 정보와 같은 특별한 경우를 제외하고 확장 영역 비트맵의 변경사항은 데이터 딕셔너리에 있는 테이블을 갱신하지 않으므로 실행 취소 정보를 생성하지 않습니다.
- 데이터 딕셔너리 테이블에 사용 가능 영역을 기록하지 않으므로 테이블의 경합을 줄입니다.
- 인접한 사용 가능 공간을 자동 추적하므로 사용 가능한 확장 영역을 통합할 필요가 없습니다.


4. Undo Tablespace(실행취소 테이블스페이스)


- 실행취소 세그먼트를 저장하고 다른 객체를 포함할 수 없습니다.
- 확장영역을 지역적으로 관리하며 데이터 파일절 및 Extent Management절만 사용합니다.


SQL> CREATE UNDO TABLESPACE undo1
    DATAFILE '/u01/oradata/undo01.dbf' size 40M;




5. Temporary Tablespaces(임시 테이블스페이스)


- 정렬 작업에 사용하여 공간을 효과적으로 관리할 수 있습니다.
서버 프로세스가 DB 캐시로부터 100만건의 데이터를 받아 PGA(Program Global Area)에서 정렬 작업을 합니다. PGA용량이 충분하다면 정렬이 되겠지만 용량이 작다면 100만건의 데이터가 정렬할때까지 전달하지 못합니다. 이런경우 임시 테이블스페이스를 사용합니다. 저장하는 곳이 아니며 임시로 사용하는 공간입니다. 임시 테이블스페이스도 부족할 경우에는 자신의 용량만큼만 수행을 하고 에러가 발생하고 멈춰버립니다.


SQL> CREATE TEMPORARY TABLESPACE temp
    TEMPFILE '/u01/oradata/temp01.dbf' SIZE 500M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;



5.1. Default Temporary Tablesapce(기본임시 테이블스페이스)
- 모든 데이터베이스를 생성할 경우 System 테이블스페이스는 기본 임시 테이블스페이스로 사용됩니다.
- 기본 임시 테이블스페이스를 생성하면 System 테이블 스페이스는 사용되지 않습니다.
- 하나의 임시 테이블스페이스를 여러곳에서 사용할순 있지만 동시에 사용은 불가능합니다. 이런경우 데이터 처리가 줄을 서게됩니다. 그래서 각각 임시 테이블스페이스를 여러개 만들어 1:1로 할당을 해주면 좋습니다. 하지만 만드는 것도 중요하지만 관리가 더 중요할 것입니다.

기본임시 테이블스페이스 생성 및 찾기

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;   // 생성
SQL> SELECT * FROM DATABASE_PROPERTIES;          // 질의



5.2. 제한 사항
- 새 기본값을 사용할 수 있을때까지 기본 임시 테이블스페이스는 삭제할 수 없습니다. 기본 임시 테이블스페이스 변경은 ALTER DATABASE 명령 사용합니다.
- 오프라인으로 설정 불가능
- 영구 테이블스페이스로 변경 불가능


6. Read Only Tablespaces(읽기 전용 테이블스페이스)



SQL> ALTER TABLESPACE userdata READ ONLY;

- 테이블이 모두 SELECT밖에 되지 않는다. 데이터를 읽을 수만 있다는 것이다.
  다시 반대로 적용하기 위해 Read Write로 쿼리를 입력하면 원상복귀된다.


7. 테이블스페이스 오프라인 설정


- 오프라인 설정을 하면 이후의 SQL문은 이 테이블스페이스에 포함된 객체를 참조할수 없게 된다. 데이터 액세스 불가
- 오프라인 설정 불가 테이블 스페이스 : SYSTEM 테이블스페이스, UNDO 테이블스페이스, DEFAULT TEMPORARY 테이블 스페이스

SQL> ALTER TABLESPACE userdata OFFLINE;        // 오프라인 설정
SQL> ALTER TABLESPACE userdata ONLINE;        // 온라인 설정



8. 테이블스페이스 크기 조정


- 테이블 파일의 크기 변경

CREATE DATABASE
CREATE TABLESPACE
ALTER TABLESPACE ... ADD DATAFILE


자동: AUTOEXTEND를 사용한 자동 변경

SQL > CREATE TABLESPACE user_data
    DATAFILE '/u10/oradata/userdata01.dbf' SIZE 200M
    AUTOEXTEND ON NEXT 10M MAXSIZE 500M;


수동: ALTER DATABASE를 사용한 수동 변경: 에러날때마다 수동으로 늘려야 하는 단점

SQL > ALTER DATABASE
    DATAFILE '/u03/oradata/userdata02.dbf'
    RESIZE 200M;


- ALTER TABLESPACE를 사용하여 데이터 파일 추가(테이블 추가)
    순차 저장이 아닌 분산 저장으로 추가된 데이터파일은 똑같은 양으로 저장이 되며 속도 향상이 된다.

SQL > ALTER TABLESPACE user_data
    ADD DATAFILE '/u01/oradata/userdata03.dbf'
    SIZE 200M;



9. 데이터 파일 이동 방식


ALTER TABLESPACE
 - 테이블스페이스는 오프라인이어야 한다.
 - 대상 데이터 파일은 반드시 존재해야 한다.


SQL > ALTER TABLESPACE user_data RENAME
    DATAFILE '/u01/oradata/userdata01.dbf'        // 원래 있던 경로
    TO '/u02/oradata/userdata01.dbf'        // 변경 경로



* 파일이동시, 따라야할 순서
1. 해당 파일을 사용 안하게 만들어야 한다.(오프라인, Shutdown-오프라인이 안될 경우: Undo, SYSTEM, DEFAULT)
2. OS명령어로 복사/이동
3. 위치정보 변경 - 데이터 파일 정보가 들어있는 ControlFile 수정(컨트롤 파일 수정시 마운트 상태에서 수정)
4. 사용할 수 있도록 설정 : 테이블스페이스 온라인 설정

ALTER DATABASE
- 데이터베이스는 마운트 되어야 한다.
- 대상 데이터 파일이 존재해야 한다.


SQL > ALTER DATABASE RENAME
    FILE '/u01/oradata/system01.dbf'
    TO '/u03/oradata/system01.dbf';



10. 테이블 스페이스 삭제


- 삭제 안되는 경우
    SYSTEM 테이블스페이스인 경우, 테이블스페이스에 사용중인 세그먼트가 있을 경우
- INCLUDING CONTENTS는 세그먼트를 삭제
- INCLUDING CONTENTS AND DATAFILES: 데이터파일을 삭제
- CASCADE CONSTRAINTS: 모든 참조 무결성 제약 조건 삭제


SQL > DROP TABLESPACE userdata
    INCLUDING CONTENTS AND DATAFILES;



11. 테이블스페이스 정보보기


테이블 스페이스: DBA_TABLESPACES, V$TABLESPACE
데이터 파일 정보: DBA_DATA_FILES, V$DATAFILE
임시파일 정보: DBA_TEMP_FILES, V$TEMPFILE


DATA FILE 및 TABLESPACE관련 조회

SQL> select tablespace_name, status, contents,
         extent_management, segment_space_management
         from dba_tablespaces;
SQL> select tablespce_name, bytes, file_name from dba_data_files;



테이브스페이스 생성

SQL> create tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
         segment space management auto;    //10g에서는 사용 안해도 됨
SQL> create tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
         extent management local;
SQL> create undo tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
SQL> create temporary tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
SQL> create tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
         blocksize<크기>
         segment space management auto;


테이블스페이스 확장

SQL> alter tablespace < tablespace 명>
         add datafile '<data file명>' size <크기>;
SQL> alter database datafile
         '<data file명>' resize <크기>;



테이블스페이스 관리

SQL> alter tablespace <tablespace 명> offline;
SQL> alter tablespace <tablespace 명> online;
SQL> alter tablespace <tablespace명> rename
         datafile '<원본data file명>'
         to '<data file명>'
SQL> alter database rename
         datafile '<원본data file명>'
         to '<data file명>'



테이블스페이스 삭제

SQL> drop tablespace <tablespace명>
         including contents and datafiles cascade constraints;