Control File 장애 복구

** Control File이 과거 버전이면 반드시 다시 만들어야 함(redo를 읽는건 datafile)

 

실습 1. Parameter File의 경로와 실제 파일 경로가 다른 경우 대처하기

==> Parameter File 에 적힌 control file 경로와 실제 control file 의 경로가 달라서 생기는 에러로 두 경로만 일치시키면 간단히 해결

실습환경 만들기

SQL> create pfile from spfile;

-- control file 유실 상황 가정(rm)

 

SQL> shutdown immediate;

!rm /oracle11/oracle/flash_recovery_area/testdb/control02.ctl

 

SQL> startup

 

 

alert log 확인

 

 

해결방법

-- 복구 수행 1) init파일의 ctl 파일 삭제 후 DB open(문제되는 2번 지우기)

* spfile로 운영시 spfile은 삭제 후 open

-- 복구 수행 2) 나머지 손상되지 않은 control file copy DB open

!cp /oracle11/oracle/oradata/testdb/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

SQL> alter database mount;

SQL> alter database open;

 

실습 2. Control File끼리 버전이 다른 경우 대처하기

==> Control file 끼리의 정보가 서로 다른 경우에 생기는 에러. Control file 끼리 정보를 맞춰주면 됨

실습환경

-- 1. pfile control file 주석 후 pfileDB OPEN (spfile 있을 시 spfile 삭제)

-- 2. shutdown immediate

-- 3. startup

-- 4. 다시 pfile control file 주석 해제 후 DB OPEN 시 에러 확인

 

 

해결방법

--버전 정보가 더 큰 파일을 작은 파일로 cp

cp /oracle11/oracle/oradata/testdb/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

SQL> alter database mount;

SQL> alter database open;

 

 

실습 3. Old Control File 또는 Control File이 삭제되었을 경우 대처하기

1) noresetlogs : 리두 리셋 안함 (resetlogsredo에도 에러있을시 사용)

 

-- control file 재생성 스크립트 만들기

alter database backup controlfile to trace as '/oracle11/backup/20151229/control.sql';

 

* 공백 / 주석을 제거해야 합니다.

 

-- 실습환경 만들기

-- 과거 컨트롤 파일로 바꿔줌

cp /oracle11/backup/20151228/control01.ctl /oracle11/oracle/oradata/testdb/control01.ctl

cp /oracle11/backup/20151228/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

SQL> startup

 

==> 반드시 control file 재생성 해주어야 함

 

SQL> shutdown immediate

 

* 해당 폴더에서 sqlplus 로 접속 후 @control.sql

 

-- control file 재생성 스크립트 만들기

alter database backup controlfile to trace as '/oracle11/backup/20151230/control.sql';

 

--장애상황 발생

--old 백업 본으로 현재 control file 덮어쓰기

alter database backup controlfile to '/oracle11/backup/20151230/control_bak.ctl'

 

drop table scott.recover_test1;

create table scott.recover_test1(a number);

insert into scott.recover_test1 values(1);

insert into scott.recover_test1 values(2);

insert into scott.recover_test1 values(3);

commit;

 

SQL> shutdown immediate

!cp /oracle11/backup/20151230/control_bak.ctl /oracle11/oracle/oradata/testdb/control01.ctl

!cp /oracle11/backup/20151230/control_bak.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

-- startup 시 에러 확인

* 컨트롤 파일은 정상인데 시점정보가 맞지 않음(01589)

 

SQL> alter database noresetlogs;

 

* controlfile을 이용해서만 noresetlogs 가능(01610)

 

SQL> alter database resetlogs;

 

* control 파일은 과거 버전인데 system01.dbf는 최신버전 즉, restore 해야 함(01152)

==> control file 재생성 판단

 

--shutdown 상태에서 수행

SQL> shutdown immediate

SQL> @/oracle11/backup/20151230/control.sql

 

SQL> alter database open;

 

 

control file 재생성 하기

--장애 상황 만들기

--01. 현재 online redo 확인

select a.group#, a.member, b.bytes/1024/1024 mb, b.sequence# "seq#", b.status, b.archived arc

from v$logfile a , v$log b

where a.group# = b.group#

order by 1,2;

 

 

 

-- inactive 이면서 arcYES인 리두로그 파일 확인 및 삭제

!rm /oracle11/oracle/oradata/testdb/redo03.log;

 

-- control file 확인

select * from v$controlfile;

 

-- 모든 control file 삭제

!rm /oracle11/oracle/oradata/testdb/control01.ctl;

!rm /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

-- shutdown immediate로 내릴 경우 에러 확인

SQL > shutdown immediate

 

 

 

SQL > shutdown abort

 

!cp /oracle11/backup/20151230/control01.ctl /oracle11/oracle/oradata/testdb/control01.ctl

!cp /oracle11/backup/20151230/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl

 

SQL > startup

 

 

SQL > @control.sql (전에 만들어둔 noresetlogs 옵션)

** redo 파일이 없어져서 error

 

control.sql 파일의 noresetlogsresetlogs로 수정 한 후

 

SQL > @control.sql

SQL > alter database open;

##ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

 

SQL > alter database open resetlogs;

Database altered.

 

1. 마운트 상태에서 alter database backup control file to trace as ‘....’; 명령어로 재생성 할 수 있는 스크립트 생성

2. 스크립트를 열어서 no resetlogs caseresetlogs case를 구분해서 재생성 스크립트를 편집

3. DB shutdown 상태로 만든 후 위 2번에서 만든 스크립트를 실행시켜 DB를 마운트 까지 시킨 후 시작

 

'Study Note > Database' 카테고리의 다른 글

Log Miner 활용과 Redo log 장애  (0) 2016.02.26
Offline 백업 본을 이용한 DB 복구  (0) 2016.02.26
Hot Backup  (0) 2016.02.26
Cold Backup  (0) 2016.02.26
No Archive log / Archive log  (0) 2016.02.26

+ Recent posts