본문 바로가기
Database/Oracle

[Oracle] Tablespace

by oncerun 2021. 8. 18.
반응형

우리가 조회하는 모든 데이터들은 Oracle에서 Data file이라는 물리적 파일 형태에 저장하고, 

이런 Data file들이 모여서 Tablespace라는 논리적 공간을 형성합니다.

 

Tablespace는 하나의 데이터베이스 안에 가장 큰 논리적 공간으로 상황에 따라 여러 개의 Tablespace로 분리하여 관리되고, Segment라는 논리적 저장공간의 집합이기도 합니다.

 

 

Tablespace의 종류

 

Permanent Tablespace

 

- 영구 테이블스페이스는 가장 일반적인 테이블스페이스로 데이터를 축적용도로 사용되는 공간입니다.

USERS, SYSAUX, SYSTEM, EXAMPLES가 해당됩니다. 

Undo, Temporary와는 다르게 고의적으로 삭제하지 않는한 영구적으로 보존되는 객체들을 저장하기 위한 용도입니다.

USERS, EXAMPLES 테이블스페이스처럼 임의의 이름을 지정하여 원하는 데이터를 저장할 수 있고, 데이터베이스가 운영되기 위해 꼭 필요한 SYSTEM과 SYSAUX 테이블 스페이스가 있습니다.

 

SYSTEM Tablespace는 데이터베이스의 운영에 필요한 기본정보를 담고 있는 Data Dictionary Table이 저장되는 공간으로 가장 중요한 Tablespace입니다. 중요한 데이터가 존재하는 만큼, 문제가 생길 시 데이터베이스는 종료될 수 있으며, 일반 사용자들의 오브젝트들을 저장하지 않는 것을 권장합니다. 

 

SYSAUX Tablespace는 SYSTEM Tablespace의 보조테이블스페이스로 기존에 STSTEM Tablespace에 있는 다양한 유틸리티 및 기능들을 분리하여 저장한 공간입니다. 데이터베이스 운영에 필수적으로 있어야 합니다. SYSAUX 테이블스페이스에 문제가 생긴 경우 시스템상에는 문제가 없지만 SYSAUX테이블에 저장된 기능들을 사용할 수 없게 됩니다.

 

Undo Tablespace는 읽기 일관성을 유지하기 위해 사용되는 Tablespace입니다.  데이터베이스 운영 중 많은 사용자들에게서 DML 작업이 이루어집니다. 이대 Rollback 하게 되는 경우를 대비하여, DML 작업이 발생했을 때 수정 이전의 값에 대한 정보를 UNDO Segment에 저장합니다. 이러한 Undo Segment에 대한 관리 공간으로 Undo Tablespace를 사용하게 되고, 데이터베이스 운영에 있어서 필수적으로 존재해야 합니다.

 

Temporary Tablespace도 필수적으로 있어야 합니다. 사용자 쿼리의 요청으로 정렬하는 작업이 필요한 경우 메모리에 부담을 덜어주기 위해 사용되는 공간입니다.

 

SELECT tablespace_name, contents
  FROM DBA_TABLESPACES;

Create Permanent Tablespace

copy sqlCREATE
[BIGFILE | SMALLFILE(기본값)]
TABLESPACE <테이블스페이스명>
DATAFILE '<경로>' SIZE <크기>
[EXTENT MANAGEMENT
	[
    	DICTIONARY | LOCAL(기본값) [AUTOALLOCATE(기본값) | UNIFORM SIZE <크기>]
    ]
]
[SEGMENT SPACE MANAGEMENT [AUTO(기본값) | MANUAL]]

 

 

 

BIGFILE 과 SMALLFILE의 큰 차이는 만들 수 있는 데이터 파일의 개수와 크기입니다.

BIGFILE의 경우 데이터 파일은 딱 하나를 사용할 수 있습니다. BIGFILE은 (Automatic Storage Management)가 생기면서 만들어졌습니다. BIGFILE이 나오기 전에 SMALLFILE은 여러 개의 디스크에 균등하게 수동으로 데이터 파일을 만들어 줬습니다. ASM을 사용할 수 있으면 자동으로 균등하게 디스크 별로 공간을 할당해주기 때문에 굳이 여러 개의 데이터 파일을 관리할 필요 없이 하나의 파일을 사용하고, ASM으로 공간을 할당하면 더 쉽게 관리할 수 있어 BIGFILE을 사용합니다.

 

EXTENT MANAGEMENT

Tablespace의 공간 할당은 Extent 단위로 진행됩니다. DML 작업이 반복되면서 Extent의 할당과 반환이 발생하는데 어느 Extent를 사용해도 되는지에 대한 정보 관리가 필요합니다.

이러한 EXTENT관리에는 DICTIONARY와 LOCAL 방법이 존재합니다.

 

* Extent는 연속적으로 존재하는 Block을 묶어 둔 것을 의미하는 논리적 단위입니다.

* OS block -> Oracle block -> Extent -> Segment -> Tablespace -> Database

 

SELECT VALUE FROM V$PARAMETER WHERE NAME = 'db_block_size';

SELECT VALUE FROM V$PARAMETER WHERE NAME = 'db_file_multiblock_read_count';

 

오라클은 존재하는 Segment의 Extent들이 가득 찼을 때 동적으로 공간을 할당합니다.

즉 Oralce은 데이터의 입력이 필요한 만큼 동적으로 Segment를 생성해 내부 Extent를 채웁니다.

 

다시 돌아와서, Extent의 management의 dictionary 방식은 사용 가능한 Extent 정보를 Data Dictionary에서 관리합니다.

DML 작업을 할 때에도 내부적으로 Data Dictionary를 사용하는데, Extent의 정보까지 관리하게 되면, 경합 발생 가능성이 높아 현재는 사용되지 않는 방식이며, LOCAL은 data file의 header에 비트맵을 통해 Extent의 사용 유무를 관리하는 방식입니다. 각 Data file의 자원 사용량은 높아지지만 경합 발생보다는 더 좋은 방법입니다.

기본 값인 AUTOALLOCATE 방식을 사용하면, 자동으로 Extent의 크기를 정하도록 위임할 수 있으며, UNIFORM 옵션을 사용하면 모든 Extent의 크기를 동일하게 설정 가능합니다.

 

 

Create Temporary Tablespace

copy sqlCREATE
[BIGFILE | SMALLFILE(기본값)]
TEMPORARY TABLESPACE <테이블스페이스명>
TEMPFILE '<경로>' SIZE <크기>
[EXTENT MANAGEMENT
	[
    	DICTIONARY | LOCAL(기본값) [UNIFORM SIZE <크기>(기본값 1M)]]
    ]
]

Temporary Tablespace는 기본적으로 LOCAL UNIFORM SIZE 1M이고 SEGMENT SPACE MANAGEMENT는 AUTO를 사용할 수 없습니다.

 

 create temporary tablespace abc
tempfile '/opt/oracle/dbf/abc.tmp' size 20m;
select 
    tablespace_name
    ,contents
    ,initial_extent
    ,next_extent
    ,extent_management
    ,allocation_type
    ,segment_space_management 
from dba_tablespaces
where tablespace_name = 'ABC';

 

 

Default Temporary Tablespace 변경

select * from database_properties where property_name like 'DEFAULT_TEMP%'

 

alter database default temporary tables=<테이블스페이스명>

위명령으로 변경 가능합니다.

 

 

Create Undo Tablespace

copy sqlCREATE
[BIGFILE | SMALLFILE(기본값)]
UNDO TABLESPACE <테이블스페이스명>
DATAFILE '<경로>' SIZE <크기>
[EXTENT MANAGEMENT
	[
    	DICTIONARY | LOCAL(기본값) [AUTOALLOCATE(기본값)]
    ]
]

Undo Tablespace는 UNIFORM SIZE를 지정할 수 없고 Segment Space Management도 MANUAL만 가능합니다.

 

create undo tablespace abc
datafile '/opt/oracle/dbf/abc.dbf' size 20m;
select 
    tablespace_name
    ,contents
    ,initial_extent
    ,next_extent
    ,extent_management
    ,allocation_type
    ,segment_space_management 
from dba_tablespaces
where tablespace_name = 'ABC';

 

 

Default Undo Tablespace 변경

show parameter undo_tablespace

 

alter system set undo_tablespace=<테이블스페이스명>

위 명령으로 변경 가능합니다.

 

 

Tablespace Datafile 추가, 삭제

추가

alter tablespace users add datafile '/opt/oracle/app/oradata/orcl/users02.dbf' size 10m;
select 
    tablespace_name
    ,file_name 
from dba_data_files 
where tablespace_name = 'USERS';

 

 

삭제

select tablespace_name, file_id, file_name from dba_data_files where tablespace_name = 'USERS';

alter tablespace users drop datafile 6;

file id 혹은 file_name 전체 경로로 삭제 가능합니다.

 

 

Tablespace 삭제

drop tablespace <테이블스페이스명> including contents and datafiles;

contents : 모든 세그먼트를 삭제

datafiles : 모든 데이터 파일까지 삭제

반응형

'Database > Oracle' 카테고리의 다른 글

ORACLE SQL 날짜함수  (0) 2021.11.26
테이블 생성시 추가 속성  (0) 2021.08.04
테이블 및 칼럼 조회  (0) 2021.08.02
[Oracle] Cursor  (0) 2021.05.19
[ORACLE] PL/SQL  (0) 2021.05.16

댓글