2016년 5월 25일 수요일

[Recovery] REDO log file과 관련된 데이터베이스 복구 방법

REDO log file과 관련된 데이터베이스 복구 방법
** 테스트 환경
- OS : Windows XP
- DB : Oracle 9.2.0.1
- redo log : 3개의 Group, 각 1개의 member로 구성

** 시나리오
1. redo log의 각 Group에 각각 member 1개씩 추가한 후
임의의 member가 삭제되거나 파일에 문제가 있을 경우 복구 방법
(단, Current redo log중 반드시 1개의 member는 정상이어야 함)

-> 아무런 추가작업 없이 데이터베이스를 Open할 수 있음.
(Oracle이 스스로 쓸수 없게 된 redo log파일은 Invalid 상태로 만들어줌)

2. 모든 redo log파일이 삭제되었거나 파일에 문제가 생겨 쓸 수 없게 된 경우

-> Init parameter에 Hidden parameter인 _allow_resetlogs_corruption=true
항목을 추가한 후 recover database 하고, resetlogs 옵션으로 DB를 Open할 수 있다.

a. Init 파일에 _allow_resetlogs_corruption=true 추가
b. SQL> startup mount;
c. SQL> recover database until cancel;
d. SQL> alter database open resetlogs;

** 테스트 로그

-- 첫번째 시나리오

13:55:18 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG

경 과: 00:00:00.02
13:55:26 SQL> alter database add logfile member
13:56:00 2 'D:\ORACLE\ORA92\ORA9\REDO11.log' to group 1,
13:56:10 3 'D:\ORACLE\ORA92\ORA9\REDO12.log' to group 2,
13:56:17 4 'D:\ORACLE\ORA92\ORA9\REDO13.log' to group 3;

데이타베이스가 변경되었습니다.

경 과: 00:00:17.08

13:55:18 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO11.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO12.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO13.LOG

경 과: 00:00:00.02

13:56:42 SQL> alter system switch logfile;

시스템이 변경되었습니다.

경 과: 00:00:00.04
13:56:51 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:05.01
13:56:56 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:00.04
13:56:56 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:00.05
13:56:57 SQL> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.


-- 이부분에서 redo log의 2번째 member 파일을 물리적으로 삭제함.


13:57:09 SQL> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.


-- 아무런 복구절차 없이 DB가 Open됨.

13:58:06 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG
1 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO11.LOG
2 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO12.LOG
3 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO13.LOG


6 개의 행이 선택되었습니다.

경 과: 00:00:00.01
13:58:11 SQL> alter system switch logfile;

시스템이 변경되었습니다.

경 과: 00:00:00.03
13:58:18 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:00.02
13:58:19 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:00.05
13:58:20 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:00.02
13:58:20 SQL> /

시스템이 변경되었습니다.

경 과: 00:00:00.01
13:58:21 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG
1 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO11.LOG
2 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO12.LOG
3 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO13.LOG


6 개의 행이 선택되었습니다.

경 과: 00:00:00.02
13:58:26 SQL> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

-- 두번째 시나리오

13:58:38 SQL> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.
13:59:04 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG
1 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO11.LOG
2 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO12.LOG
3 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO13.LOG


6 개의 행이 선택되었습니다.

경 과: 00:00:00.03
13:59:11 SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV STATUS FIRST
_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- ------ -------------------------------- -----
-------- --------
1 1 25 104857600 2 NO CURRENT
518277 06/04/04
2 1 23 104857600 2 NO INACTIVE
518273 06/04/04
3 1 24 104857600 2 NO INACTIVE
518275 06/04/04

경 과: 00:00:00.00
14:00:17 SQL> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

-- redo log 중 정상이던 1번째 member 파일을 물리적으로 삭제함.

14:04:52 SQL> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
데이터베이스가 마운트되었습니다.
ORA-00314: 로그 1(스레드 1의, 시퀀스번호가 일)는 와 일치하지 않습니다
ORA-00312: 온라인 로그 1 스레드 1: 'D:\ORACLE\ORA92\ORA9\REDO01.LOG'
ORA-00312: 온라인 로그 1 스레드 1: 'D:\ORACLE\ORA92\ORA9\REDO11.LOG'

-- 사용할 수 있는 redo log 파일이 하나도 없으므로 DB가 Open되지 않음.(mount상태)


14:05:53 SQL>
14:05:54 SQL>
14:05:54 SQL> select * from v$instance;

INSTANCE_NUMBER INSTANCE_NAME
--------------- --------------------------------
HOST_NAME
----------------------------------------------------------------------------------------------------
----------------------------
VERSION STARTUP_ STATUS PARALL THREAD# ARCHIVER
LOG_SWITCH_WAIT LOGINS
---------------------------------- -------- ------------------------ ------ ---------- -------------
- ---------------------- --------------------
SHUTDO DATABASE_STATUS INSTANCE_ROLE ACTIVE_STATE
------ ---------------------------------- ------------------------------------ ------------------
1 ora9
HLIM
9.2.0.1.0 06/04/04 MOUNTED NO 1 STOPPED
ALLOWED
NO ACTIVE PRIMARY_INSTANCE NORMAL


경 과: 00:00:00.00
14:05:58 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG
1 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO11.LOG
2 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO12.LOG
3 INVALID ONLINE D:\ORACLE\ORA92\ORA9\REDO13.LOG

6 개의 행이 선택되었습니다.

경 과: 00:00:00.02

14:08:29 SQL> select * from v$recover_file;

선택된 레코드가 없습니다.

경 과: 00:00:00.08

-- Oracle 9i로서 Init parameter 를 spfile로 사용중이었으므로
-- init parameter를 수정하기 위해 spfile을 pfile로 변경함.

14:08:47 SQL> create pfile from spfile;

파일이 생성되었습니다.

경 과: 00:00:00.01
14:10:12 SQL> shutdown immediate;
ORA-01109: 데이터베이스가 개방되지 않습니다


데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

-- Init parameter에 _allow_resetlogs_corruption=true 항목을 추가한 후 DB를 mount함.

14:10:28 SQL> startup mount;
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
데이터베이스가 마운트되었습니다.
14:11:50 SQL> alter database open resetlogs;
alter database open resetlogs
*
1행에 오류:
ORA-01139: RESETLOGS 옵션은 불완전한 데이터베이스의 복구 후에만 유효합니다


경 과: 00:00:00.02
14:12:00 SQL> recover database until cancel;
매체 복구가 완료되었습니다.
14:12:34 SQL> alter database open resetlogs;

데이타베이스가 변경되었습니다.

경 과: 00:00:42.03
14:13:28 SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- -------------- -------------- --------------------------------------------
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO01.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO02.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO03.LOG
1 ONLINE D:\ORACLE\ORA92\ORA9\REDO11.LOG
2 ONLINE D:\ORACLE\ORA92\ORA9\REDO12.LOG
3 ONLINE D:\ORACLE\ORA92\ORA9\REDO13.LOG


6 개의 행이 선택되었습니다.

-- 기존에 Invalid 상태였던 redo log파일까지 모두 복구하였음.

경 과: 00:00:00.04
14:13:36 SQL> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
14:15:37 SQL>

댓글 없음:

댓글 쓰기