데이터파일 배치와 OMF
OMF의 데이터 파일 배치, 온라인 MOVE DATAFILE과 오프라인 이름 변경 절차
#핵심 요약
OMF를 쓰면 파일 이름 대신 데이터베이스 객체 단위로 작업함DB_CREATE_FILE_DEST를 정해 두면 CREATE TABLESPACE에서 DATAFILE 절을 생략할 수 있음
OMF 파일은 테이블스페이스를 DROP하기만 해도 운영체제 파일까지 지워짐
ALTER DATABASE MOVE DATAFILE은 데이터베이스가 열려 있고 파일을 쓰는 중에도 데이터 파일을 옮기거나 이름을 바꿈
이동 중에도 조회, DML, DDL이 됨
이동 대상이 오프라인이면 오류가 남
같은 이름의 파일이 대상에 있으면 REUSE 없이는 실패함KEEP은 원래 파일을 남김
#개념과 동작 원리
#OMF
OMF는 테이블스페이스, 리두 로그 파일, 컨트롤 파일, 아카이브 로그, 블록 변경 추적 파일, 플래시백 로그, RMAN 백업 같은 파일을 데이터베이스가 만들고 지우게 함
한 데이터베이스 안에 OMF 파일과 일반 파일이 섞여 있어도 됨
OMF 파일은 SYSTEM, SYSAUX를 포함해 기본 100MB, 자동 확장으로 만들어짐
리눅스와 유닉스의 파일 이름 형식은 <destination_prefix>/o1_mf_%t_%u_.dbf임
이름이 OMF 여부를 나타내므로 파일 이름을 직접 바꾸면 안 됨
ASM은 기본적으로 OMF 방식이지만, 별칭 이름을 직접 지정한 ASM 파일은 OMF로 취급되지 않음
| 초기화 파라미터 | 지정하는 위치 |
|---|---|
DB_CREATE_FILE_DEST |
데이터 파일과 임시 파일의 기본 디렉터리 |
DB_CREATE_ONLINE_LOG_DEST_n |
리두 로그 파일과 컨트롤 파일 |
DB_RECOVERY_FILE_DEST |
고속 복구 영역(fast recovery area) |
파라미터가 가리키는 디렉터리는 미리 있어야 하고(데이터베이스가 만들어 주지 않음) 데이터베이스가 파일을 쓸 권한이 있어야 함
#데이터베이스 확장 방법
- 새 테이블스페이스를 만듦
- 스몰파일 테이블스페이스에 데이터 파일을 추가함
- 기존 데이터 파일 크기를 늘림
- 자동 확장(AUTOEXTEND)을 설정함
#열린 상태에서 데이터 파일 이동
ALTER DATABASE MOVE DATAFILE은 온라인 데이터 파일의 이름을 바꾸거나 위치를 옮기고, 운영체제 수준에서도 실제로 옮김
쓰는 이유의 예: 다른 저장 장치로 옮기기, 자주 안 쓰는 파일을 싼 저장 장치로 옮기기, 읽기 전용 테이블스페이스를 한 번 쓰기 저장 장치로 옮기기, ASM으로 옮기기
REUSE가 없고 대상에 같은 이름의 파일이 있으면 덮어쓰지 않고 오류를 냄
기본 동작은 이동임KEEP을 주면 원래 위치의 파일을 남기고 새 위치로 복사함
지정한 데이터 파일이 오프라인이면 오류가 남
플래시백으로 이동 전 시점으로 돌아가도 파일 위치는 돌아가지 않고, 내용만 그 시점으로 바뀜
Windows에서는 KEEP이 없어도 원래 파일이 남을 수 있음
설명:
TO 절은 OMF를 쓸 때만 생략할 수 있고, 그때 DB_CREATE_FILE_DEST가 새 위치가 됨
원래 파일이 OMF 파일이면 KEEP을 쓸 수 없음KEEP으로 남긴 파일은 데이터베이스가 관리하지 않으므로 DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES로도 지워지지 않음
진행 상태는 V$SESSION_LONGOPS에서 이동 한 건당 한 행으로 보이고, 보통 NORMAL, COPYING, SUCCESS, NORMAL 순서로 바뀜
압축된 객체는 이동 후에도 압축 상태가 유지됨
#예전 방식: 오프라인 이름 변경
오프라인 데이터 파일의 이름 변경과 이동은 컨트롤 파일에 기록된 포인터만 바꿈
운영체제 파일은 직접 복사하거나 옮겨야 함
한 테이블스페이스의 파일은 테이블스페이스를 오프라인으로 바꾼 뒤 ALTER TABLESPACE ... RENAME DATAFILE로 바꾸고 다시 온라인으로 올림
여러 테이블스페이스의 파일은 ALTER DATABASE RENAME FILE을 씀
ALTER TABLESPACE 시스템 권한이 필요하고, 구조를 바꾼 뒤에는 바로 전체 백업을 하라고 권함
실습에서는 MOUNT 상태에서 바꾸는 흐름을 적었음SHUTDOWN IMMEDIATE, 운영체제에서 파일 이동, STARTUP MOUNT, ALTER DATABASE RENAME FILE '<옛 경로>' TO '<새 경로>', ALTER DATABASE OPEN 순서임
실습에서는 파일 경로가 컨트롤 파일에 있고 MOUNT가 컨트롤 파일까지 읽은 상태라서 가능하다고 설명함
#필수 명령어 또는 SQL
#OMF로 테이블스페이스 만들기
mkdir -p <OMF_DIR>ALTER SYSTEM SET db_create_file_dest = '<OMF_DIR>';
CREATE TABLESPACE omf_test;SELECT file_name, bytes/1024/1024 AS mb
FROM dba_data_files
WHERE tablespace_name = 'OMF_TEST';결과 해석:
실습 기록: 파일 이름이 <OMF_DIR>/<DB 고유 이름>/DATAFILE/o1_mf_omf_test_<임의 문자열>_.dbf 형식으로 만들어졌음
ALTER TABLESPACE omf_test ADD DATAFILE;
ALTER TABLESPACE omf_test ADD DATAFILE '<DATAFILE_DIR>/omf_test02.dbf' SIZE 10M;결과 해석:
실습 OCP 실습: OMF가 켜져 있으면 ADD DATAFILE만으로 파일이 추가됨
경로를 직접 적으면 그 경로가 우선함
결과는 기재 없음
DROP TABLESPACE omf_test;
ALTER SYSTEM SET db_create_file_dest = '';결과 해석:
설명: OMF 파일이므로 DROP만으로 데이터 파일까지 지워짐DB_CREATE_FILE_DEST를 빈 값으로 되돌리면 이후 DATAFILE 절을 생략했을 때 다시 오류가 남
위 블록처럼 경로를 직접 적어 추가한 파일도 함께 지워지는지는 기재 없음
#열린 상태에서 데이터 파일 옮기기
CREATE TABLESPACE move_test
DATAFILE '<DATAFILE_DIR>/move_test01.dbf' SIZE 50M;
CREATE TABLE move_demo (id NUMBER, txt VARCHAR2(200)) TABLESPACE move_test;
INSERT INTO move_demo
SELECT ROWNUM, RPAD('X', 200, 'X') FROM dual CONNECT BY LEVEL <= 1000;
COMMIT;ALTER DATABASE MOVE DATAFILE '<DATAFILE_DIR>/move_test01.dbf'
TO '<NEW_DIR>/move_test01b.dbf';UPDATE move_demo SET txt = RPAD('Y', 200, 'Y') WHERE id <= 100;
COMMIT;
SELECT opname, target, sofar, totalwork, message
FROM v$session_longops
WHERE opname LIKE '%Move%'
ORDER BY start_time DESC;결과 해석:
설명: 이동 중에도 창 2의 UPDATE가 막히지 않음
50MB 파일은 이동이 금방 끝나 중간 상태를 보기 어렵고, 보려면 파일을 크게 늘린 뒤 하라고 적었음
SELECT file_name FROM dba_data_files WHERE tablespace_name = 'MOVE_TEST';
SELECT file#, name, status FROM v$datafile WHERE name LIKE '%move_test%';결과 해석:
설명: 두 조회 모두 새 이름 하나만 나옴
예전 이름을 따로 보관하지 않고 수동 동기화 절차도 없음
#KEEP과 REUSE
ALTER DATABASE MOVE DATAFILE '<NEW_DIR>/move_test01b.dbf'
TO '<NEW_DIR>/move_test01c.dbf' KEEP;
-- 대상에 같은 이름의 파일이 남아 있으므로 실패
ALTER DATABASE MOVE DATAFILE '<NEW_DIR>/move_test01c.dbf'
TO '<NEW_DIR>/move_test01b.dbf';
-- REUSE로 덮어쓰기
ALTER DATABASE MOVE DATAFILE '<NEW_DIR>/move_test01c.dbf'
TO '<NEW_DIR>/move_test01b.dbf' REUSE;결과 해석:
실습에서는 KEEP 이동과 그 뒤 두 경로를 서로 다른 디렉터리로 적었음
실패와 성공 결과는 설명이며 실행 기록은 없음
DROP TABLESPACE move_test INCLUDING CONTENTS AND DATAFILES;결과 해석:
KEEP으로 남긴 파일은 이 명령으로 지워지지 않으므로 운영체제에서 직접 지움
#사용 조건과 주의사항
실습 ④는 이동 명령을 "같은 디렉터리에서 파일 이름만 바뀌는 상황"이라고 설명했지만, 적힌 원래 경로와 대상 경로의 디렉터리가 다름
MOVE DATAFILE은 파일이 오프라인이면 실패함
대기 데이터베이스가 있으면 주 데이터베이스와 대기 데이터베이스에서 각각 따로 실행할 수 있음
수업 자료에는 OMF와 세그먼트 축소를 비교한 실습(딕셔너리 관리 테이블스페이스 생성 시 ORA-12913, 수동 세그먼트 공간 관리에서 SHRINK 시 ORA-10635)도 있음
축소는 세그먼트 공간 회수 글 범위임