RDB/Oracle

[오라클] 불완전복구,log파일복구

창문닦이 2019. 1. 30. 12:17

[불완전복구 - 3. 백업control파일을 이용한 복구(아카이브로그가 아닌 ctl파일에서복구] 

① 문제상황

레코드를 지워야하는데 테이블을 삭제해서 복구하는 경우 - 시간기반/취소기반 복구

테이블을 삭제해야하는데 테이블스페이스를 삭제해서 복구하는 경우 -  백업control파일을 이용한 복구

 

 

② 서버가 SHUTDOWN하는 것과 같은 명령어 입력시 alert_testdb.log에 모두 기록됨.

drop 명령어 입력시 정확한 시간을 모를 경우 해당 경로의 로그파일을 확인하면 된다.

경로 : C:\app\itwill\diag\rdbms\testdb\testdb\trace

 

③ 데이터베이스 시작

STARTUP MOUNT

 

④ 아카이브파일이 없는 상태에서 컨트롤파일을 사용해서 복구 진행

RECOVER DATABASE UNTIL TIME '복구시점' USING BACKUP CONTROLFILE;AUTO

 

⑤ 데이터베이스 오픈 & 로그 리셋

ALTER DATABASE OPEN RESETLOG

 

⑥ 테이블스페이스  복구되었는지 확인

@DDF

COL TABLESPACE_NAME FORMAT A16

COL FILE_NAME FORMAT A29

SELECT TABLESPACE_NAME,BYTES,FILE_NAME FROM DBA_DATA_FILES;



SYS@TestDB> shutdown immediate
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.


SYS@TestDB> startup mount
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area 3390558208 bytes
Fixed Size                  2180464 bytes
Variable Size            1862273680 bytes
Database Buffers         1509949440 bytes
Redo Buffers               16154624 bytes
데이터베이스가 마운트되었습니다.


SYS@TestDB> recover database until time '2019-01-30:10:04:25' using backup controlfile;
ORA-00279: 변환 1673786가 (01/30/2019 10:01:02에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\36_1_996676816.ARC
ORA-00280: 변환 1673786(스레드 1를 위한)가 시퀀스번호 36에 있습니다

로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log 'C:\ADISK\ARC2\36_1_996676816.ARC'
ORA-27041: unable to open file
OSD-04002: 파일을 열 수 없음
O/S-Error: (OS 2) 지정된 파일을 찾을 수 없습니다.

ORA-00308: cannot open archived log 'C:\ADISK\ARC2\36_1_996676816.ARC'
ORA-27041: unable to open file
OSD-04002: 파일을 열 수 없음
O/S-Error: (OS 2) 지정된 파일을 찾을 수 없습니다.

SYS@TestDB> alter database open resetlogs;

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

SYS@TestDB> @ddf

TABLESPACE_NAME       BYTES FILE_NAME
---------------- ---------- -----------------------------
USERS              13107200 C:\APP\ITWILL\ORADATA\TESTDB\
                           USERS01.DBF

UNDOTBS1          104857600 C:\APP\ITWILL\ORADATA\TESTDB\
                           UNDOTBS01.DBF

SYSAUX            618659840 C:\APP\ITWILL\ORADATA\TESTDB\
                           SYSAUX01.DBF

SYSTEM            723517440 C:\APP\ITWILL\ORADATA\TESTDB\
                           SYSTEM01.DBF

TABLESPACE_NAME       BYTES FILE_NAME
---------------- ---------- -----------------------------

EXAMPLE           104857600 C:\APP\ITWILL\ORADATA\TESTDB\
                           EXAMPLE01.DBF

TEST               10485760 C:\ADISK\DISK1\TEST01.DBF

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

SYS@TestDB>

 


[log파일 복구 - 1. 대기 상태 그룹의 멤버문제 ]

INACTIVE 상태의 로그 멤버가 망가졌을 때

① 로그 그룹에 멤버 1개씩 추가. (멤버가 망가졌을 때 복구하는 방법을 진행하기 위해 각 그룹에 멤버를 추가함)

ALTER DATABASE ADD LOGFILE MEMBER

'C:\APP\ITWILL\ORADATA\TESTDB\REDO01B.LOG' TO GROUP 1,

'C:\APP\ITWILL\ORADATA\TESTDB\REDO02B.LOG' TO GROUP 2,

'C:\APP\ITWILL\ORADATA\TESTDB\REDO03B.LOG' TO GROUP 3;

 

 

② 별도의 디스크에 백업 받아놓은 상태

 

③ 디스크가 망가졌다는 전제 사항 (REDO02B.LOG를 삭제 - INACTIVE 상태의 로그파일)

 

④ REDO02.LOG가 존재하므로 STARTUP 실행 가능 (이게 멀티플렉싱을 하는 이유, 특정 디스크가 고장나더라도 복구 가능)

 

⑤ REDO02.LOG 물리적파일을 찾을 수 없기 때문에, 오라클상에서도 지워줌

ALTER DATABASE DROP LOGFILE MEMBER

'C:\APP\ITWILL\ORADATA\TESTDB\REDO02B.LOG'

 

 

⑥ 손상된 로그 멤버 재추가(복구)

ALTER DATABASE ADD LOGFILE MEMBER

'C:\APP\ITWILL\ORADATA\TESTDB\REDO02B.LOG' TO GROUP 2;

 

 


 

[log파일 복구 - 2. 대기 상태 그룹의 문제(2가지: Open, Close복구) ]

DB가 OPEN과 CLOSE상태일 때, 복구 진행

① 3번 그룹의 LOG파일이 전부 삭제됨

 

② STARTUP 진행시 로그파일이 망가졌으므로 마운트상태까지만 진행되고 에러메세지가 뜸

SHUTDOWN ABORT 로 종료

 

③ STARTUP MOUNT 단계까지만 진행

 

④ 더이상 로그파일 그룹3을 사용하지말라고 선언해줌. 진행하면서 이미 기파일이 존재하지 않으므로 빈파일을  생성시킴

 

⑤ 오라클에서도 없어진 로그그룹에 대해 반영이 되도록 DROP 명령어 작성

 

⑥ 로그그룹1,2가 존재하므로 데이터베이스 오픈 진행 가능

- 로그파일 확인하면 그룹3이 지워진 것을 볼 수 있다.

 

⑦ 쓰레기 파일과 충돌 나지 않도록 LOG파일 삭제 확인 후 새로 생성 진행

 

로그파일을 조회하면 잘 생성된 것을 볼 수 있다

 


 

[log파일 복구 - 3. Current 로그 장애(2가지: Open, Close복구) ]

① CURRENT 그룹 1이 손상됨

아카이브로그파일 45번까지 존재 46까지 있는데 46이 손상됨

 

② STARTUP진행 안됨. 로그파일의 오류 때문.

 

③ 아카이브 로그파일이 손상되었으므로 장애가 발생한 그룹의 넘버를 작성해서 미반영하겠다고 명령어 작성

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;

 

④ DBF파일만 백업해서 복구함

 

⑤ 복구 진행

RECOVER DATABASE UNTIL CANCEL;

CURRENT 로그 파일 직전까지 복구 진행 (46번이 current일때 오류발생 > 45번까지 복구 진행)

불완전복구. CURRENT 로그가 망가졌을 땐 100% 복구를 할 수 없다.

 

- 로그를 리셋시킨 후 로그그룹 조회

 

- 로그스위치 진행

 

- 아카이브 로그파일이 저장된 폴더에 로그파일이 리셋되어 1번부터 저장되는 것을 확인할 수 있다.

 

 


 

[log파일 복구 - 4. 전체삭제(2가지 : 모든 Redolog파일 삭제, 모든 Control파일 삭제) ]

① 트레이스파일을 수동으로 만드는 명령어

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

경로 : C:\app\itwill\diag\rdbms\testdb\testdb\trace 에 trc 파일이 생성되는 것을 확인할 수 있다

 

② 문제발생! (ROG파일만 삭제. REDOLOG 전부가 손상되었다는 가정)

③ 로그파일이 없으므로 STARTUP 진행시 반드시 오류남. 마운트상태로 시작해야 함

 

④ TRC파일 조회 시

Set #1. NORESETLOGS case - 컨트롤파일이 지워졌을때 필요

Set #2. RESETLOGS case - 로그파일이 지워졌을때 필요

빨간 블록범위를 복사해서 CREATE.SQL 스크립트 생성.

 

⑤ 스크립트 실행시 마운트 상태로 데이터베이스 진행됨.

 

⑥ 결과 조회시 로그파일이 생성되어졌고, 로그스위치도 문제 없이 진행됨