UMF vs OMF
: file의 관리를 사용자가 하는가 ? 오라클이 하는가에 따라 구분.
OMF는 9i부터 나옴
UMF
- User Managed File의 약자
- 일반적으로 테이블스페이스나 리두파일의 생성, 삭제시 사용자가 수동으로 해줘야함.
OMF
- Oracle Managed File의 약자
- 오라클 데이터베이스에 의해 생성되고, 관리되는 파일.
- 파일 관리의 편이성. 삭제할 때 OS에 직접가서 지우다가 생기는 실수를 유발할 가능성이 배제하기 위해 사용
- OMF에 의해 생긴 파일의 이름은 바꾸면 안됨
A feature of the Oracle database which manages the creation, naming and deletion of Oracle database files within dedicated areas of disk, to minimize the need for DBAs to concern themselves with such specifics.
실습을 해보자.
파라미터를 설정한다.
(db_create_file_dest : 데이터 파일과 템프 파일이 생성되는 위치,
db_create_online_log_dest_n : 리두 로그 파일과 컨트롤 파일이 생성되는 위치,
db_recovery_file_dest : RMAN 백업 위치)
SQL> alter system set db_create_file_dest = '/u01/app/oracle/oradata/jgh_db';
SQL> alter system set db_create_online_log_dest_1 = '/u01/app/oracle/oradata/jgh_db';
SQL> alter system set db_create_online_log_dest_2 = '/u01/app/oracle/oradata/jgh_db';
잘 설정되었는지 확인해본다.
SQL> show parameter db_create
테이블 스페이스를 생성하고, 파일이 잘 생성되었는지 확인해본다.
SQL> create tablespace ts1;
SQL> !ls -R /u01/app/oracle/oradata/jgh_db
테이블 스페이스를 삭제하고, 잘 삭제되었는지 확인해본다.
SQL> drop tablespace ts1;
SQL> !ls -R /u01/app/oracle/oradata/jgh_db
로그 파일을 생성하고 확인해본다.
SQL> alter database add logfile;
SQL> !ls -R /u01/app/oracle/oradata/jgh_db
로그파일을 삭제하고 확인해본다.
SQL> alter database drop logfile group 1;
SQL> !ls -R /u01/app/oracle/oradata/jgh_db
OMF + ASM (Automatic Storage Management)
관련 실습 (그냥 참고 삼아서 볼 것)
CREATE DISKGROUP dg1
NORMAL REDUNDANCY
FAILGROUP controller1 DISK
'/devices/diska1',
'/devices/diska2',
'/devices/diska3',
'/devices/diska4'
FAILGROUP controller2 DISK
'/devices/diskb1',
'/devices/diskb2',
'/devices/diskb3',
'/devices/diskb4';
CREATE DISKGROUP dg2
NORMAL REDUNDANCY
FAILGROUP controller1 DISK
'/devices/diska11',
'/devices/diska12',
'/devices/diska13',
'/devices/diska14'
FAILGROUP controller2 DISK
'/devices/diskb21',
'/devices/diskb22',
'/devices/diskb23',
'/devices/diskb24';
SQL> alter system set db_create_file_dest = '+dg1'; -- Database Area
SQL> alter system set db_create_online_log_dest_1 = '+dg1';
SQL> alter system set db_create_online_log_dest_2 = '+dg1';
SQL> alter system set db_recovery_file_dest = '+dg2'; -- Flash Recovery Area(FRA)
DMT vs LMT
: extent의 관리를 data dictionary에서 하는가? 아니면 로컬에서 하는가? 에 따라 구분된다.
DMT
- Dictionary Managemant Tablespace의 약자
- FET$, UEF$와 관련.
- 시스템 테이블 스페이스가 DMT명 DMT와 LMT를 같이 쓸 수 있음
create tablespace users
datafile '/u01/app/oracle/oradata/jgh_db/users.dbf' size 10m
extent management dictionary;
LMT
- Locally Managed Tablespace의 약자
- 공간을 할당하면 공간에 대한 기본적인 정보를 공간 내에서 관리
- 시스템 테이블 스페이스가 LMT면 LMT만 가능
- 디폴트
create tablespace users
datafile '/u01/app/oracle/oradata/jgh_db/users.dbf' size 10m
extent management local [option];
※[option]에 따라 extent의 크기가 결정된다.
extent management local autoallocate; -- 오라클 마음대로
extent management local uniform; -- 모든 extents의 크기 : 1m로 통일
extent management local uniform size ?; -- 모든 extents의 크기 : ? 로 통일
FLM vs ASSM
: segment의 관리를 segment의 헤더의 freelist를 이용하여 할 것인가?
FLM
- FreeList Managemant의 약자
ASSM
- Automatic Segment Storage Management의 약자
- Block을 어떻게 관리할 것인가?
-- LMT + ASSM : default
create tablespace users
datafile '/u01/app/oracle/oradata/jgh_db/users.dbf' size 10m
extent management local
segment space management auto;
-- LMT + FLM
create tablespace users
datafile '/u01/app/oracle/oradata/jgh_db/users.dbf' size 10m
extent management local
segment space management manual;
-- DMT + ASSM
: 불가능: ORA-30572 : AUTO segment space management not valid with DICTIONARY extent management
create tablespace users
datafile '/u01/app/oracle/oradata/jgh_db/users.dbf' size 10m
extent management dictionary
segment space management auto;
-- DMT + FLM : 오래된 방식으로 가능하면 사용하지 않는게 좋음
create tablespace users
datafile '/u01/app/oracle/oradata/jgh_db/users.dbf' size 10m
extent management dictionary
segment space management manual;
※ 참고 : DMT의 Storage 옵션 이해
create tablespace users5
datafile '/u01/app/oracle/oradata/jgh_db/user4.dbf' size 10m
extent management dictionary
minimum extent 100k -- 모든 extents는 100k의 정수가 되어야 한다.
default storage (initial 100k -- 첫번째 extent의 크기
next 100k -- 두번째 이후 extent의 크기.
-- 처음 이후에 되도록이면 initial과 같게 해줌
minextents 3 -- 최초 몇 개의 extent?
maxextents 10 -- 최대로 만들 수 있는 extent 무제한(unlimited)
pctincrease 50 -- 퍼센트 : 3번째 부터 extent의 성장 비율
-- 100k -> 100k -> 150k -> 225k
);
create table t1 (c1 number) tablespace users5;
create table t1 (c1 number) tablespace users5 storage (initial 150k next 150k);
단편화 (fragmentation)
: 세그먼트의 중간중간에 사용하지 않는 공간이 발생하는 것을 말한다.
문제점
- 테이블 FULL SCAN시 소요 시간 증가
- 인덱스 레벨이 깊어짐
- 디스크 I/O 증가 가능 (하나의 데이터 블록 조회로 적은 로우가 추출)
- 디스크 공간 낭비
원인은?
- 서로 다른 크기가 들락날락하면서 생긴다.
해결책은?
- LMT로 한다. (uniform을 셋팅하여 extent의 크기를 모두 고정시킨다.)
- DMT일 경우 pctincrease옵션 0을 주고, minimum extents 100k로 특정 크기의 배수로 주도록 한다.
테이블 스페이스의 관리
- 이름 변경
SQL> alter tablespace "USER1" rename to "DDD";
※ 테이블스페이스명을 소문자일 경우 인식을 못함.
(X) alter tablespace "user1" rename to "DDD";
- 상태 변경
SQL> alter tablespace "USER1" read only;
SQL> alter tablespace "USER1" read write;
SQL> alter tablespace "USER1" offline normal;
- 크기 변경
SQL> alter tablespace "USER1" add datafile '/u01/app/oracle/oradata/jgh_db/USER2.dbf' size 10m;
-- 줄이는 것 불가능
SQL> alter database datafile '/u01/app/oracle/oradata/jgh_db/user1.dbf' resize 20m; -- 줄이는 것도 가능
SQL> alter database dafafile '/u01/app/oracle/oradata/jgh_db/user2.dbf' autoextend on next 10m maxsize 2g;
SQL> alter tablespace "USER1" nologging;
ASM
- Automatic Storage management
- 11g r2에서 다른 일반적인 파일도 들어올 수 있음.
- spreading, mirroring 가능
기타내용
테이블 디렉토리 : 클러스터의 다른 테이블의 위치 정보시 필요함.
로우 디렉토리 : (변경될 수 있는) 로우의 위치 정보(2kb)
로우 헤더 : 로우의 길이가 들어가 있음
online redo log file 존재의 주목적은?
- instance 복구
- commit 속도를 빠르게 한다.
테이블 스페이스의 종류
- permanant : 어떤 종류의 테이블 스페이스도 다 만들 수 있다.
- temp : temp전문 테이블 스페이스
- undo : undo전문 테이블 스페이스(9i부터)
insert : freelist + transaction slot이 필요함
update: transaction slot이 필요함
Bitmap?
- 비트의 맵. extents가 할당되면 1, 해제되면 0
- 부동산 앞의 지도와 같은 역할이라고 보면 이해하기 쉬움