데이터베이스 연구실.log

데이터파일 배치와 OMF

OMF의 데이터 파일 배치, 온라인 MOVE DATAFILE과 오프라인 이름 변경 절차

OMFDB_CREATE_FILE_DESTMOVE DATAFILEKEEPREUSERENAME FILEV$SESSION_LONGOPS

#핵심 요약

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)

파라미터가 가리키는 디렉터리는 미리 있어야 하고(데이터베이스가 만들어 주지 않음) 데이터베이스가 파일을 쓸 권한이 있어야 함

#데이터베이스 확장 방법

  1. 새 테이블스페이스를 만듦
  2. 스몰파일 테이블스페이스에 데이터 파일을 추가함
  3. 기존 데이터 파일 크기를 늘림
  4. 자동 확장(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로 테이블스페이스 만들기

OS 셸 (oracle 사용자)객체 또는 설정을 변경함
mkdir -p <OMF_DIR>
SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
ALTER SYSTEM SET db_create_file_dest = '<OMF_DIR>';

CREATE TABLESPACE omf_test;
SQL*Plus (SYSDBA, 대상 PDB)조회만 함
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 형식으로 만들어졌음

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
ALTER TABLESPACE omf_test ADD DATAFILE;
ALTER TABLESPACE omf_test ADD DATAFILE '<DATAFILE_DIR>/omf_test02.dbf' SIZE 10M;

결과 해석:

실습 OCP 실습: OMF가 켜져 있으면 ADD DATAFILE만으로 파일이 추가됨
경로를 직접 적으면 그 경로가 우선함
결과는 기재 없음

SQL*Plus (SYSDBA, 대상 PDB)데이터 또는 파일을 삭제함, 되돌릴 수 없음
DROP TABLESPACE omf_test;

ALTER SYSTEM SET db_create_file_dest = '';

결과 해석:

설명: OMF 파일이므로 DROP만으로 데이터 파일까지 지워짐
DB_CREATE_FILE_DEST를 빈 값으로 되돌리면 이후 DATAFILE 절을 생략했을 때 다시 오류가 남
위 블록처럼 경로를 직접 적어 추가한 파일도 함께 지워지는지는 기재 없음

#열린 상태에서 데이터 파일 옮기기

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
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;
SQL*Plus (SYSDBA, 대상 PDB, 창 1)객체 또는 설정을 변경함
ALTER DATABASE MOVE DATAFILE '<DATAFILE_DIR>/move_test01.dbf'
  TO '<NEW_DIR>/move_test01b.dbf';
SQL*Plus (SYSDBA, 대상 PDB, 창 2)객체 또는 설정을 변경함
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 파일은 이동이 금방 끝나 중간 상태를 보기 어렵고, 보려면 파일을 크게 늘린 뒤 하라고 적었음

SQL*Plus (SYSDBA, 대상 PDB)조회만 함
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

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
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 이동과 그 뒤 두 경로를 서로 다른 디렉터리로 적었음
실패와 성공 결과는 설명이며 실행 기록은 없음

SQL*Plus (SYSDBA, 대상 PDB)데이터 또는 파일을 삭제함, 되돌릴 수 없음
DROP TABLESPACE move_test INCLUDING CONTENTS AND DATAFILES;

결과 해석:

KEEP으로 남긴 파일은 이 명령으로 지워지지 않으므로 운영체제에서 직접 지움

#사용 조건과 주의사항

실습 ④는 이동 명령을 "같은 디렉터리에서 파일 이름만 바뀌는 상황"이라고 설명했지만, 적힌 원래 경로와 대상 경로의 디렉터리가 다름

MOVE DATAFILE은 파일이 오프라인이면 실패함
대기 데이터베이스가 있으면 주 데이터베이스와 대기 데이터베이스에서 각각 따로 실행할 수 있음

수업 자료에는 OMF와 세그먼트 축소를 비교한 실습(딕셔너리 관리 테이블스페이스 생성 시 ORA-12913, 수동 세그먼트 공간 관리에서 SHRINK 시 ORA-10635)도 있음
축소는 세그먼트 공간 회수 글 범위임

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기