본문 바로가기
Infra & Security Eng/Database Engineering

컨츄롤 파일 파일다중화, 리두로그파일 로그 스위치와 체크포인트, 리두 로그 그룹 추가와 삭제, 리두 로그 멤버 추가와 삭제, 파일 재배치 실습

by 엔지니어 E 2026. 4. 8.
반응형

파일 다중화 실습 (컨츄롤파일)

실습 내용: 컨츄롤 파일을 2개로 늘리는 작업, /app/ora19c/oradata/DB19 안에 있는 파일들(ex.control101.ctl)을 옮기는 작업을 할 것임
* 반드시 VMware에서 takeshot 찍어놓을 것(데이터베이스 잃을 위험있으므로. 데이터베이스 소실되면 다시 설치 해서 진행함)
기존: /app/ora19c - 오라클 베이스 


기존: /app/ora19c/oradata/DB19 - 여기에 컨츄롤 파일(ex.control01.ctl) 등이 다 모여 있음

1. /app/ora19c/oradata 까지는 같고 이 밑에 /disk1 /disk2 /disk3 /disk4 /disk5 를 만들것임
* 다른 드라이브의 파티션이라고 간주할 것

2. /disk1 /disk2 /disk3 : 데이터 파일 용도(datafile)로 사용 할 것임

3. disk4 /disk5 : 컨츄롤 파일(log, ctl) 용도로 사용 할 것임
* 현재 control01.ctl, control02.ctl는 미러셋(완전히 물리적으로 같은 상태)인 상태
* 미러셋일때는 같은 이름으로 쓰는게 좋음 ( control01.ctl, control01.ctl 이렇게)

 

변경할 작업
/app/ora19c/oradata/disk4/control.ctl
/app/ora19c/oradata/disk5/control.ctl

1.
- sqlplus / as sysdba 
- startup


2. SHOW PARAMETER control_files - 현재 제어파일 위치 확인 


3. ALTER SYSTEM SET control_files=

   '/app/ora19c/oradata/disk4/control.ctl',
   '/app/ora19c/oradata/disk5/control.ctl' SCOPE=SPFILE;

4. exit (os에서 작업해야됨)

5.

mkdir -p /app/ora19c/oradata/disk4
mkdir -p /app/ora19c/oradata/disk5

cp /app/ora19c/oradata/DB19/control01.ctl /app/ora19c/oradata/disk4/control.ctl
cp /app/ora19c/oradata/DB19/control01.ctl /app/ora19c/oradata/disk5/control.ctl
* 원본이 control01이든 control02든 상관없음. 어차피 내용이 똑같은 파일이라 01이나 02 아무거나 복사해도 됨
6.
- sqlplus / as sysdba
- startup

7.

SHOW PARAMETER control_files 로 확인하면 됨
교안에서는 cp가 아닌 mv로 진행했기 때문에 mv 명령어로 다시 진행함

>SHUTDOWN IMMEDIATE;
>!mv /app/ora19c/oradata/DB19/control01.ctl /app/ora19c/oradata/disk4/control.ctl
>!mv /app/ora19c/oradata/DB19/control02.ctl /app/ora19c/oradata/disk5/control.ctl
>!ls /app/ora19c/oradata/disk4
>!ls /app/ora19c/oradata/disk5
> STARTUP

SELECT name, value FROM v$parameter

2  WHERE name LIKE 'control_files'; 로 확인 한다


> SELECT name FROM v$controlfile; 로 확인 한다

* current 그룹이 sequence 넘버가 가장 높음

로그 스위치, 체크포인트(리두 로그 파일) 실습

실습: 
* 그룹은 최소 2개 이상 있어야 하고, 그룹 안에 멤버는 최소 1명 있어도 됨(우리는 그래도 불안하니 disk4와 disk5에 미러링 해서 멤버 1명씩 둘 것임) 
Redo log file 확인하기 

SQL> SELECT A.GROUP#, A.MEMBER, B.BYTES, B.STATUS, B.SEQUENCE#
  2  FROM V$LOGFILE A, V$LOG B
  3  WHERE A.GROUP# = B.GROUP#
  4  ORDER BY 1;

- 현재 log 그룹과 member의 운영 상황을 조회함

- GROUP#: 그룹 번호
- MEMBER: 멤버 파일의 경로 및 파일명 
- BYTES; 멤버 파일의 크기 

 

현재 상태 확인하기
SELECT a.group#, a.member, b.bytes, b.status, b.sequence#

FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1; sqlplus / as sysdba


현재 상태 확인하기
SELECT a.group#, a.member, b.bytes, b.status, b.sequence#

FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;

* GROUP# : 그룹번호 / STATUS : CURRENT(사용중) ACTIVE(체크포인트미완) INACTIVE(재사용가능) UNUSED(미사용)


> ALTER DATABASE DROP LOGFILE GROUP 2; - 리두 로그 그룹 2번을 삭제하는 명령어

* 위의 사진에서 Group 2 = INACTIVE → 삭제 가능 → 성공


>ALTER SYSTEM SWITCH LOGFILE; - CURRENT를 다음 그룹으로 넘김 (CURRENT 변경)

실습결과: 현재 상태를 다시 확인해보면 GROUP 2가 삭제됨을 확인
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

> ALTER SYSTEM CHECKPOINT; 
* CHECKPOINT: 메모리에 있는 변경사항을 디스크에 저장함

에러원인
당시 상태: MOUNT (컨트롤 파일만 읽은 상태)
필요 상태: OPEN (데이터 파일까지 모두 활성화된 상태)
체크포인트(Checkpoint)**는 메모리(Buffer Cache)에 있는 데이터를 **데이터 파일(.dbf)**에 기록하는 작업임. 그런데 DB가 MOUNT 상태이면 데이터 파일이 아직 "닫혀 있는" 상태나 마찬가지라 오라클이 기록을 할 수가 없음. 그래서 "입구가 안 열렸는데 어떻게 들어가서 기록하냐"며 ORA-01109 에러를 낸 것임

트러블슈팅 해결
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL; - 복구 명령 다시 시작
/app/ora19c/oradata/DB19/redo03.log - 로그파일 경로 입력 
ALTER DATABASE OPEN RESETLOGS; - 데이터베이스 오픈 
SELECT INSTANCE_NAME, STATUS, DATABASE_STATUS FROM V$INSTANCE; - 아래 쿼리를 날려서 STATUS가 **OPEN**인지, 데이터베이스 이름이 맞는지 확인


> ALTER SYSTEM CHECKPOINT; 
위의 트러블슈핑 해결로 체크포인트가 정상적으로 작업할 수 있게됨

[변경 전]
GROUP #  STATUS    SEQUENCE#
------           --------          ---------
 1         INACTIVE            4
 3         CURRENT            6 

[변경 후]
GROUP   #  STATUS    SEQUENCE#
------              --------          ---------
 1              CURRENT           1
 3             UNUSED               0


현재 상태 확인하기
SELECT a.group#, a.member, b.bytes, b.status, b.sequence#

FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;
* 복구(RESETLOGS)때문에 1번이 CURRENT 가 되었고 이를 디스크에 중간 저장(CHECKPOINT)을 함


> !vi switch.sql 실행
SQL*Plus에서 매번 두 줄의 명령어를 직접 타이핑하기 번거롭기 때문임. !는 OS(리눅스)로 나가서 vi 편집기를 실행하라는 뜻이며, 자주 쓰는 명령어를 **배치 파일(스크립트)**로 저장해두고 @switch로 한 번에 실행하려는 목적임


ALTER SYSTEM SWITCH LOGFILE; - 현재 쓰기 지점을 다음 그룹으로 이동함
* 주인공 교체 → 3번이 새로 쓰는 로그(CURRENT)가 됨

ALTER SYSTEM CHECKPOINT; - 메모리의 변경 데이터를 디스크(.dbf)에 기록함
* 1번 (INACTIVE): 저장 완료. 지금 즉시 삭제 가능한 상태


>switch - 위에 적은 명령어 실행


 SELECT a.group#, a.member, b.bytes, b.status, b.sequence#

  2  FROM v$logfile a, v$log b
  3  WHERE a.group# = b.group#
  4  ORDER BY 1; 

 

리두 로그 그룹 추가와 삭제 실습


> ALTER DATABASE DROP LOGFILE GROUP 3;> ALTER DATABASE DROP LOGFILE GROUP [group number];
지정한 redo log group을 삭제한다

> ALTER DATABASE ADD LOGFILE GROUP [group number]
2 (['member file1', 'member file2', ... ]) SIZE [크기]; - redo log group을 추가한다.
* [group number]는 생략 가능하다

[그룹 삭제]

> ALTER DATABASE DROP LOGFILE GROUP 3; - 3번 리두 로그 그룹을 삭제


SELECT a.group#, a.member, b.bytes, b.status, b.sequence#
  2  FROM v$logfile a, v$log b
  3  WHERE a.group# = b.group#
  4  ORDER BY 1;

GROUP 3 삭제 확인 


!ls /app/ora19c/oradata/DB19/ - 데이터베이스의 물리적인 목록 확인



> !rm /app/ora19c/oradata/DB19/redo03.log
* 오라클에서 명령어로 그룹을 지우는 것과 OS에서 파일을 지우는 것이 별개이기 때문에 물리적으로 삭제해줘야함



[그룹 추가]

SQL> ALTER DATABASE ADD LOGFILE GROUP 4

  2  '/app/ora19c/oradata/DB19/redo04.log' SIZE 50M;      
* 4번 리두 로그 그룹을 새로 만들면서, 용량은 50MB로 설정하고 실제 파일은 지정한 경로에 생성하는 명령어



SELECT a.group#, a.member, b.bytes, b.status, b.sequence#
FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;
명령어로 확인


@switch 명령어 실행




SELECT a.group#, a.member, b.bytes, b.status, b.sequence#

FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;
명령어로 확인 -> GROUP 1,2,4의 STATUS가 변경됨을 확인


SQL> ALTER DATABASE ADD LOGFILE GROUP 5
  2  '/app/ora19c/oradata/DB19/redo05.log' SIZE 50M; - GROUP 5 생성


SELECT a.group#, a.member, b.bytes, b.status, b.sequence#

FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;
명령어로 확인 -> GROUP 5가 생성됨을 확인


@switch 명령어 실행


SELECT a.group#, a.member, b.bytes, b.status, b.sequence#
FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;
명령어로 확인 -> GROUP들의 STATUS가 변경됨을 확인

 

리두 로그 멤버 추가와 삭제

SQL> ALTER DATABASE DROP LOGFILE MEMBER
  2   ['member file1', 'member file2', ...];
     - 지정한 멤버 파일을 삭제한다

SQL> ALTER DATABASE ADD LOGFILE MEMBER
  2  ['member file'] TO GROUP [group nember],
  3  ... ;
     -  redo log 멤버 파일을 지정한 그룹에 추가한다

SQL> ALTER DATABASE ADD LOGFILE MEMBER                
  2  '/app/ora19c/oradata/DB19/redo04_2.log' TO GROUP 4,
  3  '/app/ora19c/oradata/DB19/redo05_2.log' TO GROUP 5;
* 4번과 5번 리두 로그 그룹에 각각 두 번째 멤버(거울 파일)를 추가하여 로그 파일의 안정성을 높이는(다중화하는) 명령어


SELECT a.group#, a.member, b.bytes, b.status, b.sequence#
FROM v$logfile a, v$log b
WHERE a.group# = b.group#
ORDER BY 1;
명령어로 확인 -> 멤버가 각 4,5 그룹에 생성됨을 확인 


SQL> ALTER DATABASE DROP LOGFILE MEMBER       
  2  '/app/ora19c/oradata/DB19/redo04.log'; 

* redo04.log 파일이 안지워진다면?
나중에 추가한 멤버가 아직 완전한 상태가 아니라고 판단하면 원본(redo04.log) 삭제를 끝까지 막는다 

1. ALTER SYSTEM SWITCH LOGFILE; - 그룹을 다시 한번 활성화 하기(4번 그룹이 CURRENT가 되었다가 다시 INACTIVE가 될 때까지 돌린다) - 이렇게까지 안해도 몇번 명령어 돌리니 되긴했음
2. ALTER SYSTEM CHECKPOINT; - 체크포인트 강제 발생(빨리 기록하라고 명령)
3. 다시 삭제 시도하면 에러 해결 


SQL> ALTER DATABASE DROP LOGFILE MEMBER       
  2  '/app/ora19c/oradata/DB19/redo01.log';



에러 상태 해결 하기
@switch 4번 돌려 해결함
오라클이 데이터 유실을 막으려고 로그 파일의 안전 상태를 확인하느라 삭제를 거부했다가, 로그 스위치로 데이터 저장이 완벽히 끝나자 비로소 삭제를 허락해준 것임

 

리두 로그 파일 재배치

[현 상태]
GROUP     #  MEMBER                                        BYTES                  STATUS       SEQUENCE    #
------  ---------------------------------------------              -----------                    --------             ---------
     1  /app/ora19c/oradata/DB19/redo01.log           209,715,200      INACTIVE                             1
     2  /app/ora19c/oradata/DB19/redo02.log           209,715,200      CURRENT                             1
     4  /app/ora19c/oradata/DB19/redo04_2.log       52,428,800        INACTIVE                             1
     5  /app/ora19c/oradata/DB19/redo05.log           52,428,800        INACTIVE                             1
     5  /app/ora19c/oradata/DB19/redo05_2.log       52,428,800        INACTIVE                             1

[바꿔야하는 내용]
GROUP# MEMBER                                      BYTES       STATUS      SEQUENCE#
---------- ------------------------------------------- ----------- ---------- ----------
         1 /app/ora19c/oradata/disk4/redo01.log         52,428,800 UNUSED              0
         1 /app/ora19c/oradata/disk5/redo01.log         52,428,800 UNUSED              0
         2 /app/ora19c/oradata/disk4/redo02.log         52,428,800 UNUSED              0
         2 /app/ora19c/oradata/disk5/redo02.log         52,428,800 UNUSED              0
         3 /app/ora19c/oradata/disk4/redo03.log         52,428,800 UNUSED              0
         3 /app/ora19c/oradata/disk5/redo03.log         52,428,800 UNUSED              0


[목표로 하는 새로운 그룹 생성]

ALTER DATABASE ADD LOGFILE GROUP 3 
('/app/ora19c/oradata/disk4/redo03.log', 
 '/app/ora19c/oradata/disk5/redo03.log') SIZE 50M; --- 그룹3 생성(disk4, disk5 분산)


ALTER DATABASE ADD LOGFILE GROUP 6
('/app/ora19c/oradata/DB19/redo06.log') SIZE 50M;--- 임시 그룹 6 생성 (기존 1, 2번을 삭제하기 위해 현재 활성 그룹을 옮겨올 용도)

[로그 스위치를 통해 기존 그룹 비우기]

ALTER SYSTEM SWITCH LOGFILE; --- 6번 그룹이 CURRENT가 될 때까지 반복 (여기서는 2번 반복함)



ALTER SYSTEM CHECKPOINT; --- 체크포인트를 발생시켜 모든 그룹을 INACTIVE 상태로 강제 전환

[기존 구형 그룹(1, 2, 4, 5) 삭제]

ALTER DATABASE DROP LOGFILE GROUP 1;
ALTER DATABASE DROP LOGFILE GROUP 2;
ALTER DATABASE DROP LOGFILE GROUP 4;
ALTER DATABASE DROP LOGFILE GROUP 5;

[비어있는 1, 2번 번호를 사용하여 목표대로 생성]

ALTER DATABASE ADD LOGFILE GROUP 1 
('/app/ora19c/oradata/disk4/redo01.log', 
 '/app/ora19c/oradata/disk5/redo01.log') SIZE 50M; --- 그룹 1 생성


ALTER DATABASE ADD LOGFILE GROUP 2 
('/app/ora19c/oradata/disk4/redo02.log', 
 '/app/ora19c/oradata/disk5/redo02.log') SIZE 50M;


ALTER SYSTEM SWITCH LOGFILE; --- 다시 로그 스위치를 해서 1, 2, 3번 중 하나가 CURRENT가 되게 함
ALTER SYSTEM CHECKPOINT;-  6번은 삭제할 것이므로 ACTIVE 상태면 안됨, 6번 로그를 INACTIVE 상태로




ALTER SYSTEM SWITCH LOGFILE; - 1~3번이 CURRENT로 되게 만들기 


ALTER SYSTEM CHECKPOINT; --- 체크포인트 실행 (안전한 삭제를 위해)



ALTER DATABASE DROP LOGFILE GROUP 5;
ALTER DATABASE DROP LOGFILE GROUP 6; --- 이제 5번과 6번은 목표 리스트에 없으므로 지워준다
참고사항 
1. 그룹 추가 할 수 있어야 함
2. 그룹 삭제 할 수 있어야 함
3. 그룹에 멤버 추가할 수 있어야 함
4. 그룹 안에 멤버를 삭제할 수 있어야함
* active, current 상태면 못건드림